Проблема с обновлением Symfony 2 -> 3: должен быть предоставлен экземпляр ControllerResolver TraceableControllerResolver

После обновления до Symfony 3 следующий прослушиватель событий теперь получает TraceableControllerResolver вместо ControllerResolver. Это вызывает следующие ошибки подсказки типа:

must be an instance of Symfony\Bundle\FrameworkBundle\Controller\ControllerResolverInterface, instance of Symfony\Component\HttpKernel\Controller\TraceableControllerResolver given

Это только кажется, в случае разработки, в производстве тип остается ControllerResolver.

Я могу убрать подсказку типа, но мне кажется, что это не лучшее решение. Это единственное решение или в Symfony 3 есть лучший шаблон проектирования для того, чего я пытаюсь достичь - который в конечном итоге заключается в получении согласованного в данный момент контроллера в прослушивателе событий.

Вот пример кода, иллюстрирующий проблему:

Конфигурация:

    listener:
        class: \EventListener\AccessCheckListener
        scope: request
        arguments: ["@controller_resolver","@session", "@router", "@request_stack"]
        tags:
           - { name: kernel.event_listener, event: kernel.exception, method: onAccessDeniedException }

Слушатель:

class AccessCheckListener
{
    protected $_session;
    protected $_router;
    protected $_request_stack;
    protected $controllerResolver;

    public function __construct(ControllerResolver $controllerResolver, Session $session, Router $router, RequestStack $_request_stack)
    {
        $this->_session = $session;
        $this->_router = $router;
        $this->_request_stack = $_request_stack;
        $this->controllerResolver = $controllerResolver;
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно сообщению об ошибке:

must be an instance of Symfony\Bundle\FrameworkBundle\Controller\ControllerResolverInterface, instance of Symfony\Component\HttpKernel\Controller\TraceableControllerResolver given

в версии Symfony 3.4 нет интерфейса Symfony\Bundle\FrameworkBundle\Controller\ControllerResolverInterface.

Измените пространство имен использования ControllerResolverInterface на Symfony\Component\HttpKernel\Controller в прослушивателе событий.

Хорошо, круто, спасибо. Сообщение об ошибке было связано с предыдущей попыткой решения, которое заключалось в изменении подсказки типа с ControllerResolver на ControllerResolverInterface, чтобы обойти проблему, заключающуюся в том, что тип изменяется с ControllerResolver на TraceableControllerResolver между разработкой и производством. Таким образом, полное решение для тех, кто сталкивается с проблемой при переходе на v3, состоит в том, чтобы изменить подсказку типа на ControllerResolverInterface и добавить правильный оператор использования для использования Symfony \ Component \ HttpKernel \ Controller \ ControllerResolverIn‌ terface

jfxninja 24.07.2018 12:21

Другие вопросы по теме