我正在使用Silex并尝试使用Twig的Intl
扩展,但在尝试使用localizeddate
筛选器时出现以下错误:
过滤器"localizeddate"在"games.html"中不存在
根据这些说明,我的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 Foo())
替换$twig->addExtension(new Twig_Extensions_Extension_Intl($app))
,那么Silex似乎没有问题,即使类Foo
不存在。
如果我在Twig_Extensions_Extension_Intl
类的构造函数中抛出一个RuntimeException
,它也不会出现,所以看起来扩展从一开始就没有加载过。这一行可以在autoload_namespaces.php
文件中找到,不过:'Twig_Extensions_' => array($vendorDir . '/twig/extensions/lib')
。
我试着用同样的方式添加一个基本的Twig_SimpleFilter
,但它也不起作用,所以我尝试添加它的方式似乎完全错误,但这是我到处都能找到的方式。。。
稍后将在应用程序引导过程中重新定义trick服务。(有关调试步骤,请参阅问题注释)。第一次创建细枝时,将对其进行扩展并添加扩展。稍后,twitch再次被定义为,但这次没有添加扩展。
第二个定义覆盖了第一个定义,这是主要问题。令人困惑的是,原始扩展从未被调用。这是因为Silex在使用twitch服务之前不会实际调用您的扩展函数。由于在此之前要覆盖它,因此永远不会调用扩展函数。要进行调试,在定义了第一个时间后立即调用$app['twig']
,并确保扩展运行。通过消除过程,这意味着稍后某个时间将覆盖trick服务。您确定它在配置文件中。