2012-02-29 16 views
7

¿Cuál es la forma correcta de conectar un filtro personalizado a Twig cuando se usa Silex, pero mantener intacto el existente twig.options?Twig addFilter using Silex?

Esto es lo que quiero decir. Tengo el siguiente código:

$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')); 

Si ejecuto ese código tal como está, el filtro NO FUNCIONA.

En cambio, Twig devuelve una versión infinitamente almacenada en caché de la SOLICITUD ANTERIOR (incluso si borro los contenidos de la caché - supongo que esto se debe a que la caché se está almacenando en otra parte ya que estoy sobrescribiendo twig.options ... no estoy seguro)

Sin embargo, si deshacerse de la siguiente línea:

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

... entonces todo funciona.

¿Cómo puedo conseguir que los dos jueguen bien? es decir, mantener el caché Y agregar filtros personalizados?

Gracias!

Respuesta

20

Debería crear una extensión de rama y agregar allí su filtro.

#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"; 
    } 
} 

sobre cómo 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

funciona perfectamente, gracias! –

+0

Puede ser útil enlazar a la documentación de twig sobre este tema: http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension – Ascherer