作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 onKernelController 事件监听器重定向到我的包中的另一个 Controller 。重定向成功,但在 $newController 中,容器为 NULL,所以我不能用它做任何事情,比如渲染页面。为什么容器在这样创建时为 NULL?在这种情况下,如何将容器服务注入(inject) $newController?
谢谢! :)
事件监听器的最终工作版本:
namespace MyApp\MainBundle\EventListener;
use MyApp\MainBundle\Interfaces\UserCheckInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class ControllerListener
{
private $resolver;
/**
* @param ControllerResolver $resolver The injected controller_resolver service
*/
public function __construct($resolver)
{
$this->resolver = $resolver;
}
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if (!is_array($controller))
{
// not an object but a different kind of callable. Do nothing
return;
}
/* @var $controllerObject Controller */
$controllerObject = $controller[0];
if ( $controllerObject instanceof UserCheckInterface )
{
$newRequest = $event->getRequest()->duplicate(null, null, array('_controller' => 'MyApp\MainBundle\Controller\ErrorController::notLoggedInAction'));
/* @var $newController Controller */
$newController = $this->resolver->getController($newRequest);
$event->setController($newController);
}
}
}
这是config.yml
kernel.listener.ControllerListener:
class: MyApp\MainBundle\EventListener\ControllerListener
arguments: [ "@controller_resolver" ]
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
最佳答案
组件解析器 (Symfony\Component\HttpKernel\Controller\ControllerResolver) 对容器一无所知。
相反,Symfony FrameworkBundle 提供了容器感知的 Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver。值得查看代码以了解调用 setContainer 的位置。
将 controller_resolver 服务注入(inject)您的监听器,然后使用它而不是创建新的解析器。
关于symfony - 在 Symfony2.4 中容器在 onKernelController 中使用 setController 后为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24042886/
我正在尝试从 onKernelController 事件监听器重定向到我的包中的另一个 Controller 。重定向成功,但在 $newController 中,容器为 NULL,所以我不能用它做任
我是一名优秀的程序员,十分优秀!