升级到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;
}
答案 0 :(得分:0)
根据错误消息:
必须是Symfony \ Bundle \ FrameworkBundle \ Controller \ ControllerResolverInterface的实例,Symfony \ Component \ HttpKernel \ Controller \ TraceableControllerResolver的实例
在3.4 Symfony版本中没有Symfony\Bundle\FrameworkBundle\Controller\ControllerResolverInterface
界面。
在事件侦听器中将ControllerResolverInterface
的使用命名空间更改为Symfony\Component\HttpKernel\Controller
。