我需要在项目中的几个路由上检查我的用户会话。因此,我使用了一个控制器侦听器,并在控制器是给定接口的实例的情况下查找每个请求。如果是这样,我将检查会话,如果会话无效,则应将用户重定向到另一个将修复会话的控制器。我用了这个方法这里描述的方法
这是我使用的代码:
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然后将它注入到有事件处理程序的类中。这是我将要尝试的代码路径,所以我还没有测试它,但它应该可以工作。我想我会把它放在那里帮助你。