2012-02-29 23 views
7

Jaki jest dobry sposób na podłączenie niestandardowego filtra do Twig podczas korzystania z Silex, ale zachowaj istniejący twig.options w stanie nienaruszonym?Twig addFilter za pomocą Silex?

Oto co mam na myśli. Mam następujący kod:

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

Jeśli uruchomię ten kod bez zmian, filtr NIE DZIAŁA.

Zamiast tego Twig zwraca nieskończenie buforowaną wersję POPRZEDNIEGO ŻĄDANIA (nawet jeśli wyczyściłem zawartość pamięci podręcznej - domyślam się, że jest to spowodowane tym, że pamięć podręczna jest przechowywana w innym miejscu, ponieważ nadpisuję twig.options ... nie jestem pewien).

Jednak gdybym rowu następujący wiersz:

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

... to wszystko działa.

Jak mogę ładnie grać? np. zachować pamięć podręczną ORAZ dodać niestandardowe filtry?

Dzięki!

Odpowiedz

20

Powinieneś utworzyć rozszerzenie gałązki i dodać tam swój filtr.

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

Jak zarejestrować go:

#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

działa perfekcyjnie, dzięki! –

+0

Może być dobrze połączyć się z dokumentacją gałązki na ten temat: http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension – Ascherer