функции шаблона slim / twig-view — TwigExtension не определены и работают

#php #twig #slim #twig-extension #slim-4

#php #twig #slim #twig-расширение #slim-4

Вопрос:

Я следую описанным здесь шагам, чтобы использовать twig-view в Slimhttps://github.com/slimphp/Twig-View/tree/3.1.0#usage но я получаю следующую ошибку на своем экране, когда пытаюсь использовать любую из функций шаблона, используемых в TwigExtension

Fatal error: Uncaught TwigErrorSyntaxError: Unknown "url_for" function.

Я успешно запустил $ composer require slim/twig-view:^3.0 , мой файл composer.json выглядит следующим образом

 "require": {
        "slim/slim": "4.*",
        "slim/psr7": "^1.2",
        "league/container": "^3.3",
        "slim/twig-view": "^3.0"
    },
  

и это мой код

 require_once __DIR__ . '/../vendor/autoload.php';

$container = new SlimFactoryContainer();
SlimFactoryAppFactory::setContainer($container);

$container->add('view', function () {
    return SlimViewsTwig::create(__DIR__ . '/views', [
        'cache' => false,
    ]);
});

$app = SlimFactoryAppFactory::create();
$app->add(SlimViewsTwigMiddleware::createFromContainer($app));

require_once __DIR__ . '/../routes.php';


// routes.php
$app->get('/', function ($request, $response, $args) use ($container) {
    return $container->get('view')->render($response, 'home.twig', ['foo' => 'test']);
})->setName('home');

// home.twig
...
<body>
    Home {{ foo }}
    <br>
    <a href="{{ url_for('about') }}">About</a>
</body>
...
  

Если я удалю url_for из шаблона twig, страница нормально загрузится в браузере. Я попытался выполнить поиск TwigExtension в моей кодовой базе и папке поставщика, но не могу найти ни одного подобного файла.
Я делаю что-то не так здесь?

Комментарии:

1. Возможно, эта ссылка может вам помочь, github.com/slimphp/Twig-View/issues/136

2. Это пространство имен и класс выглядят некорректно: SlimFactoryContainer

Ответ №1:

Похоже, это из-за контейнера League. Похоже, что при каждом вызове функции создается новый экземпляр Twig $container->get('view') каждый раз возвращает новый экземпляр вместо ссылки на один и тот же. Таким образом, обходным путем было бы

 $twig = SlimViewsTwig::create(__DIR__ . '/views', [
    'cache' => false,
]);

$container->add('view', function () use (amp;$twig) {
    return $twig;
});

// Or this instead
$container->add(
    'view', 
    SlimViewsTwig::create(__DIR__ . '/views', [
        'cache' => false,
    ])
);
  

Комментарии:

1. Запись контейнера League также может быть настроена как одноэлементная с помощью share метода.

2. @odan не могли бы вы уточнить свой комментарий, пожалуйста? может быть, в качестве ответа с примером кода?