Я следил за это руководство, чтобы добавить собственное расширение Twig в проект Symfony 4.
Мой App\Twig\AppExtension выглядит следующим образом:
<?php
namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class AppExtension extends AbstractExtension
{
public function getFunctions()
{
return [
new TwigFunction('getController', [AppRuntime::class, 'getController'])
];
}
}
И мой App\Twig\AppRuntime:
<?php
namespace App\Twig;
use Symfony\Component\HttpFoundation\RequestStack;
class AppRuntime
{
private $request;
public function __construct(RequestStack $requestStack)
{
$this->request = $requestStack->getCurrentRequest();
}
public function getController()
{
return $this->request->get('_controller');
}
}
Но если я попытаюсь использовать функцию getController() в шаблоне, я получаю следующее исключение:
Невозможно загрузить среду выполнения «App \ Twig \ AppRuntime».
Следующая строка из шаблона Twig вызывает эту ошибку:
echo twig_escape_filter($this->env, $this->env->getRuntime('App\Twig\AppRuntime')->getController(), "html", null, true);
php bin/console debug:container показывает App\Twig\AppRuntime как правильный сервис. Я также пробовал настроить App\Twig\AppRuntime как общественную службу, но безуспешно.
В чем тут может быть проблема?
Вы пометили сервис App\Twig\AppRuntime тегом twig.runtime?
Да, это был тег twig.runtime. Это нигде не задокументировано ...
Фактически, это задокументировано в руководстве, которое вы связали, но с очень незаметной печатью в самом конце инструкции. У меня была точно такая же проблема, когда я впервые делал расширение Twig, но через некоторое время я наконец заметил это :)
вам не хватало implements RuntimeExtensionInterface




Скорее всего, вы забыли пометить свой сервис расширения ветки.
Вот объяснение, как это сделать в первом примере: https://symfony.com/doc/current/service_container/tags.html
Какая у вас версия Twig? Поддержка того, что вы делаете, была добавлена в Twig 1.26.