Подтвердить что ты не робот

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);
}));

Мне не нужно это делать!! Как я могу заставить это работать правильно?

4b9b3361

Ответ 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

Четыре простых шага.

  1. Создать загрузчик
  2. Создайте объект ветки.
  3. Создайте свою пользовательскую функцию
  4. Добавьте к объекту 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);