Twig addFilter с использованием Silex?

Как правильно подключить собственный фильтр к Twig при использовании Silex, но оставить существующий twig.options нетронутым?

Вот что я имею в виду. У меня есть следующий код:

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

Если я запускаю этот код как есть, фильтр НЕ РАБОТАЕТ.

Вместо этого Twig возвращает бесконечно кэшированную версию ПРЕДЫДУЩЕГО ЗАПРОСА (даже если я удалю содержимое кеша - я предполагаю, что это потому, что кеш хранится в другом месте, так как я перезаписываю twig.options... не уверен).

Однако, если я уберу следующую строку:

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

...тогда все работает.

Как я могу заставить двоих играть красиво? то есть сохранить кеш и добавить пользовательские фильтры?

Спасибо!


person Lee Benson    schedule 29.02.2012    source источник


Ответы (1)


Вы должны создать расширение ветки и добавить туда свой фильтр.

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

Как это зарегистрировать:

#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;
}));
person Maerlyn    schedule 29.02.2012
comment
Может быть полезно дать ссылку на документацию по twig по этому вопросу: twig. sensiolabs.org/doc/advanced.html#creating-an-extension - person Ascherer; 18.04.2014