Symfony2控制器交换不工作


Symfony2 controller swap not working

我需要在项目中的几个路由上检查我的用户会话。因此,我使用了一个控制器侦听器,并在控制器是给定接口的实例的情况下查找每个请求。如果是这样,我将检查会话,如果会话无效,则应将用户重定向到另一个将修复会话的控制器。我用了这个方法这里描述的方法

这是我使用的代码:

public function onKernelController(FilterControllerEvent $event)
{
    $controller = $event->getController();
    if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) 
    {
        if (!is_array($controller)) 
            return;
        $controllerObject = $controller[0];
        if ($controllerObject instanceof PreControllerInterface) 
        {
            $result = $controllerObject->initialize($event->getRequest());
            if($result != null)
            {
                $ctrl = new PublicFrontendController();
                $event->setController(array($ctrl, 'identifyAction'));
            }
        }
    }
}

问题是我得到了以下错误:

致命错误:在第189行,对C:''Users''Yoghart''Websites''Mobile''vendor''symfony''src''symfony''Bundle''FrameworkBundle''Controller''Controller.php中的非对象调用成员函数get()

我认为被调用的控制器试图访问服务,但控制器的这个实例无法访问容器元素,因为它是空的。不幸的是,我不知道如何解决这个问题。有人知道我该怎么做吗?

致以最良好的问候Felix

我也遇到了同样的问题。我意识到这是因为你正在对Controller进行子类化,这是一个ContainerAware。您需要为它提供"service_container"服务。

最好的选择可能是将控制器定义为服务http://symfony.com/doc/current/cookbook/controller/service.html然后将它注入到有事件处理程序的类中。这是我将要尝试的代码路径,所以我还没有测试它,但它应该可以工作。我想我会把它放在那里帮助你。