После обновления до 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;
}




Согласно сообщению об ошибке:
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