我正在使用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
,它也不起作用,所以看起来我试图添加它的方式是完全错误的,但它是我找到的方式..
答案 0 :(得分:2)
稍后在应用程序启动过程中重新定义twig服务。 (有关调试步骤,请参阅问题注释)。第一次创建twig时,您正在扩展它并添加扩展名。稍后,twig将再次定义 ,但这次没有添加扩展名。
第二个定义会覆盖第一个定义,这是主要问题。令人困惑的部分是原始扩展永远不会被调用。这是因为在使用twig服务之前,Silex实际上并未调用您的扩展功能。由于在此之前覆盖它,因此永远不会调用扩展函数。要进行调试,您在定义第一个时间后立即调用$app['twig']
并确保扩展已运行。通过消除过程,这意味着树枝服务稍后会被覆盖。您确定这是在配置文件中。