2014-11-11 2 views
0

Я использую силикатный и пытаюсь использовать Intl расширения для Twig, но я получаю следующее сообщение об ошибке при попытке использовать localizeddate фильтр:Silex не будет загружать Twig расширения

The filter "localizeddate" does not exist in "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()), у Silex, похоже, не проблема, хотя класс Foo не существует.

Если я нахожу RuntimeException в конструкторе класса Twig_Extensions_Extension_Intl, он также не отображается, поэтому кажется, что расширение никогда не загружается в первую очередь. Эта строка может быть найдена в файле autoload_namespaces.php: 'Twig_Extensions_' => array($vendorDir . '/twig/extensions/lib').

Я попытался добавить базовую Twig_SimpleFilter таким же образом, она не работает, либо, так что кажется, как я пытаюсь добавить это просто неправильно, но это так, как я нахожу везде ...

+0

Мое лучшее предположение заключается в том, что служба 'twig' инициализируется до применения расширения. Есть ли что-нибудь между вызовом регистра и вызовом расширения? –

+0

Между ними, к сожалению, нет ничего. – PLPeeters

+0

Единственное, что я могу придумать, это то, что служба перезаписывается позже. Попробуйте выбросить исключение сразу после '$ twig-> addExtension()' Тогда сразу под вызовом расширения do '$ app ['twig'];' для создания экземпляра службы. Посмотрите, генерируется ли исключение. Если это так, то что-то еще перезаписывает службу «twig» по линии. –

ответ

2

Служба твинов переопределяется позже в процессе загрузки приложения. (См. Комментарии к комментариям для шагов отладки). Создается первая ветка, вы расширяете ее и добавляете расширение. Позже веточка получает определение снова, но на этот раз добавление не добавляется.

Второе определение переопределяет первое, что является основной проблемой. Запутанная часть состоит в том, что первоначальное расширение никогда не вызвано. Это связано с тем, что Silex фактически не вызывает вашу функцию расширения до тех пор, пока не будет использована услуга веточки. Поскольку вы переопределяете это до того, как это произойдет, функция расширения никогда не вызывается. Чтобы отлаживать, вы вызвали $app['twig'] сразу после того, как вы определили веточку сначала и обеспечили, чтобы расширение было запущено. Благодаря процессу устранения, это означает, что услуга веточки становится переопределенной через некоторое время. Вы определили, что это находится в файле конфигурации.

Смежные вопросы