Silex赢得';t加载Twig扩展


Silex won't load Twig extensions

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

过滤器"localizeddate"在"games.html"中不存在

根据这些说明,我的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,但它也不起作用,所以我尝试添加它的方式似乎完全错误,但这是我到处都能找到的方式。。。

稍后将在应用程序引导过程中重新定义trick服务。(有关调试步骤,请参阅问题注释)。第一次创建细枝时,将对其进行扩展并添加扩展。稍后,twitch再次被定义为,但这次没有添加扩展。

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