使用Silex的Twig addFilter?

时间:2012-02-29 18:03:47

标签: php caching symfony twig silex

在使用Silex时,将自定义过滤器连接到Twig的正确方法是什么,但保持现有的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返回PREVIOUS REQUEST的无限缓存版本(即使我清除了缓存内容 - 我猜这是因为缓存存储在别处,因为我覆盖了twig.options .. 。不确定)。

但是,如果我抛弃以下一行:

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

......然后一切正常。

我怎样才能让两人发挥得很好?即保留缓存并添加自定义过滤器?

谢谢!

1 个答案:

答案 0 :(得分:20)

您应该创建一个树枝扩展并在那里添加过滤器。

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