Symfony2:onKernelController调用两次

时间:2014-03-22 11:40:20

标签: symfony

我需要在某些情况下重定向到其他控制器,所以我创建了以下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 \控制器\控制器

因此页面显示没有样式并且有多个错误。如何避免重定向控制器?

由于

2 个答案:

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

也许不是最好/最干净的解决方案,但可以为我工作并完成工作。