我需要在某些情况下重定向到其他控制器,所以我创建了以下onKernelController方法:
public function onKernelController(FilterControllerEvent $event) {
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
$request = $event->getRequest();
$route = $request->attributes->get('_route');
if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
return;
}
if ($controller[0])
if ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') && ($route != "show_pay_pending_invoices") ) {
$client = $this->container->get('security.context')->getToken()->getUser();
if ($client->getHasPendingInvoices()) {
$request = new \Symfony\Component\HttpFoundation\Request();
$request->attributes->set('_controller', 'FusionWebBundle:User:showPayPendingInvoices');
$event->setController($this->resolver->getController($request));
}
}
}
重定向很好,但问题是它是重定向控制器,如: Symfony的\包\ AsseticBundle \控制器\ AsseticController FOS \ JsRoutingBundle \控制器\控制器
因此页面显示没有样式并且有多个错误。如何避免重定向控制器?
由于
答案 0 :(得分:1)
检查方法中FilterControllerEvent中的信息,也许你会找到可以在方法开头验证的标识符。
否则,您需要创建自己的事件并从您需要的那个特定控制器中调出它,因为它将是唯一一个分配事件的地方。 Check documentation
答案 1 :(得分:0)
我知道自问题发布以来已经过了一段时间,但我遇到了类似的问题,但在FilterControllerEvent方法中找不到任何可用于验证的标识符。所以我提出了简单的解决方案。 我添加了:
private $executed;
并在__construct中将其设置为false。
$this->executed = false;
然后在onKernelController方法结束时,我将其设置为true。
$this->executed = true;
这样我可以检查方法是否被调用。
if (!$this->executed) {
// your code
}
整个代码示例:
public function __construct(ContainerInterface $container)
{
$this->executed = false;
}
public function onKernelController(FilterControllerEvent $event)
{
// ....
if (!$this->executed) {
// your code
}
$this->executed = true;
}
也许不是最好/最干净的解决方案,但可以为我工作并完成工作。