Silex - Twig_Error_Syntax: функции "путь" не существует
Согласно документации Silex:
Symfony предоставляет мост Twig, который обеспечивает дополнительную интеграцию между некоторыми компонентами Symfony2 и Twig. Добавьте его в зависимости от вашего файла composer.json.
Я включаю следующее в мой файл composer.json
:
{
"require": {
"silex/silex": "1.*",
"twig/twig": ">=1.8,<2.0-dev",
"symfony/twig-bridge": "2.3.*"
}
}
Я регистрирую TwigServiceProvider()
так:
$app->register(new Silex\Provider\TwigServiceProvider(), array(
'twig.path' => __DIR__ . '/views'
));
Я пытаюсь использовать метод twig path()
следующим образом:
<a href="{{ path('logout') }}">Log out</a>
Ошибка, которую я получаю, выглядит следующим образом:
Twig_Error_Syntax: Функция "путь" не существует
Почему я получаю эту ошибку?
- Я попытался переключиться на версии, чтобы проверить, не является ли это проблемой версии
- Один комментарий группы google предложил "зарегистрировать" поставщика ветвей моста, но этого не существует
- Я не хочу использовать:
app.url_generator.generate
во всех моих шаблонах вместо
Временное решение, которое я нашел:
Убедитесь, что зарегистрирован UrlGeneratorServiceProvider()
:
$app->register(new UrlGeneratorServiceProvider());
Создайте новую функцию для ветки для path()
:
$app['twig']->addFunction(new \Twig_SimpleFunction('path', function($url) use ($app) {
return $app['url_generator']->generate($url);
}));
Мне не нужно это делать!! Как я могу заставить это работать правильно?
Ответы
Ответ 1
Надеюсь, это поможет будущим зрителям, поскольку многие из них разместили этот вопрос без твердого ответа, так что вот один из них.
В буквальном смысле вам нужно UrlGeneratorServiceProvider()
зарегистрировано
$app->register(new UrlGeneratorServiceProvider());
Также, как упоминает в комментариях umpirsky, вам нужно symfony/twig-bridge
установить через композитор.
Вам не нужно добавлять свою собственную функцию. Перед загрузкой шаблона ветки вам нужны как теги TwigServiceProvider()
, так и UrlGeneratorServiceProvider()
. Это легко понять из документации.
Ответ 2
Мне также пришлось создать новую функцию для twig для path()
, но я немного ее немного обработал с переменным числом аргументов, чтобы позволить передавать массивы в шаблоне ветки:
$app['twig']->addFunction(new \Twig_SimpleFunction('path', function(...$url) use ($app) {
return call_user_func_array(array($app['url_generator'], 'generate'), $url);
}));
Ответ 3
Четыре простых шага.
- Создать загрузчик
- Создайте объект ветки.
- Создайте свою пользовательскую функцию
- Добавьте к объекту Twig.
use Twig\Environment;
use Twig\TwigFunction;
use Twig\Loader\FilesystemLoader;
$loader = new FilesystemLoader('/twig/templates');
$twig = new Environment($loader, []);
$function = new TwigFunction('url', function () { return 'MyURL'; });
$twig -> addFunction($function);