Silex不会加载Twig扩展

时间:2014-11-11 12:18:34

标签: php twig silex

我正在使用Silex并尝试使用Twig的Intl扩展名,但在尝试使用localizeddate过滤器时出现以下错误:

  

过滤器“localizeddate”在“games.html”中不存在

根据these instructions,我的composer.json包含require部分中的以下行:

 "twig/extensions": "~1.1.0"

我的app.php文件包含以下内容:

$app->register(new TwigServiceProvider(), array(
    'twig.path' => __DIR__ . '/../templates/'
));

$app['twig'] = $app->share($app->extend('twig', function($twig, $app) {
    $twig->addExtension(new Twig_Extensions_Extension_Intl($app));

    return $twig;
}));

最后,我的games.html模板中的某个位置会引发上述错误:

{{ game.start_time|localizeddate('medium', 'none', 'fr') }}

为了测试,我还尝试使用Text扩展名,与链接指令完全相同,但它产生了同样的错误。

奇怪的是我可以在添加扩展名的函数中添加任何内容;只要语法有效,它就永远不会产生任何错误。因此,如果我将$twig->addExtension(new Twig_Extensions_Extension_Intl($app))替换为$twig->addExtension(new Foo()),即使类Foo不存在,Silex似乎也没有问题。

如果我在RuntimeException类的构造函数中抛出Twig_Extensions_Extension_Intl,它也不会显示,所以看起来扩展从未加载到第一位。可以在autoload_namespaces.php文件中找到此行:'Twig_Extensions_' => array($vendorDir . '/twig/extensions/lib')

我尝试以相同的方式添加基本的Twig_SimpleFilter,它也不起作用,所以看起来我试图添加它的方式是完全错误的,但它是我找到的方式..

1 个答案:

答案 0 :(得分:2)

稍后在应用程序启动过程中重新定义twig服务。 (有关调试步骤,请参阅问题注释)。第一次创建twig时,您正在扩展它并添加扩展名。稍后,twig将再次定义 ,但这次没有添加扩展名。

第二个定义会覆盖第一个定义,这是主要问题。令人困惑的部分是原始扩展永远不会被调用。这是因为在使用twig服务之前,Silex实际上并未调用您的扩展功能。由于在此之前覆盖它,因此永远不会调用扩展函数。要进行调试,您在定义第一个时间后立即调用$app['twig']并确保扩展已运行。通过消除过程,这意味着树枝服务稍后会被覆盖。您确定这是在配置文件中。