2012-02-29 12 views
7

Qual è il modo giusto per collegare un filtro personalizzato per Ramoscello quando si utilizza Silex, ma mantenere l'esistente twig.options intatto?Twig addFilter utilizzando Silex?

Ecco quello che voglio dire. Ho il seguente codice:

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => dirname(__FILE__).'/view', 
    'twig.class_path' => dirname(__FILE__).'/vendor/twig/lib', 
    'twig.options' => array('cache'=>'folder/twig') 
)); 

function test() { 
    return 'yay'; 
} 

$app['twig']->addFilter('test',new \Twig_Filter_Function('test')); 

Se corro che il codice così com'è, il filtro non funziona.

Invece, Ramoscello restituisce una versione infinitamente memorizzata nella cache del precedente richiesta (anche se posso cancellare il contenuto della cache - Sto indovinando questo è perché la cache viene memorizzato altrove dato che sto sovrascrivendo twig.options ... non è sicuro).

Tuttavia, se fosso la seguente riga:

'twig.options' => array('cache'=>'folder/twig') 

... poi tutto funziona.

Come posso far giocare bene i due? tenere la cache E aggiungere filtri personalizzati?

Grazie!

risposta

20

Dovresti creare un'estensione di ramoscello e aggiungere il tuo filtro lì.

#src/Insolis/Twig/InsolisExtension.php (snippet) 
<?php 

namespace Insolis\Twig; 

class InsolisExtension extends \Twig_Extension 
{ 
    public function getName() { 
     return "insolis"; 
    } 

    public function getFilters() { 
     return array(
      "test"  => new \Twig_Filter_Method($this, "test"), 
     ); 
    } 

    public function test($input) { 
     return "yay"; 
    } 
} 

Come registrarlo:

#app/bootstrap.php 
$app["twig"] = $app->share($app->extend("twig", function (\Twig_Environment $twig, Silex\Application $app) { 
    $twig->addExtension(new Insolis\Twig\InsolisExtension($app)); 

    return $twig; 
})); 
+0

funziona perfettamente, grazie! –

+0

Può essere utile collegare alla documentazione per il ramoscello su questo argomento: http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension – Ascherer