【发布时间】:2014-11-12 22:51:35
【问题描述】:
我正在使用 Silex 并尝试使用 Twig 的 Intl 扩展名,但尝试使用 localizeddate 过滤器时出现以下错误:
“games.html”中不存在过滤器“localizeddate”
根据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 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,但它也不起作用,所以我尝试添加它的方式似乎完全错误,但这是我在任何地方都能找到的方式......
【问题讨论】:
-
我最好的猜测是
twig服务在应用扩展之前被初始化。注册调用和扩展调用之间有什么关系吗? -
不幸的是,他们之间什么都没有。
-
我唯一能想到的另一件事是该服务稍后会被覆盖。尝试在
$twig->addExtension()之后立即抛出异常然后在extend 调用下方,执行$app['twig'];以实例化服务。查看是否抛出异常。如果是这样,其他东西正在某处覆盖twig服务。 -
在测试这个时,我最终遇到了与this answer 相关的问题中描述的错误,它解决了异常问题,但不是这里描述的主要问题。如果我按照您的建议进行操作,异常会被正确抛出,但是一旦我在扩展后立即删除实例化,它就会像预期的那样回到我们开始的地方。我的
SessionServiceProvider有另一个扩展名,稍微低一点,但我尝试将其注释掉,同样的问题。 -
在我的
app.php文件末尾实例化 Twig 会引发相同的InvalidArgumentException(Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Identifier "security.authentication_providers" is not defined.)。