【问题标题】:Silex won't load Twig extensionsSilex 不会加载 Twig 扩展
【发布时间】:2014-11-12 22:51:35
【问题描述】:

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

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

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

 "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.)。

标签: php twig silex


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多