Symfony 2-> 3升级问题:必须是给定的ControllerResolver TraceableControllerResolver实例

时间:2018-07-23 17:28:24

标签: symfony

升级到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;
    }

1 个答案:

答案 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