Symfony EventSubscriber:页面未正确重定向

时间:2018-07-11 09:51:40

标签: symfony response symfony4

我最近一直在研究Symfony4内核的EventListeners,我以为我已经掌握了它的基本概念,但是我的EventSubscriber似乎遇到了一个page isn't redirecting properly问题。

基本上,我想执行以下逻辑:

if file_exists $file
    redirect to file
else
    carry on as normal

我最初来到kernel.response的方式。这是我当前的代码:

<?php
namespace App\EventSubscriber;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class MaintenanceSubscriber implements EventSubscriberInterface
{
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        if (file_exists('maintenance.flag')) {
            $response = new RedirectResponse('maintenance');
            $event->setResponse($response);
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::RESPONSE => 'onKernelResponse'
        );
    }
}

这大致上符合我的逻辑,当maintenance.flag不存在时,它按预期进行项目,但是当我touch maintenance.flag时,它得到臭名昭著的Firefox页面Page isn't redirecting properly

我不确定是否要丢失一些东西吗?

我已经设置了路线:

maintenance:
    path: /maintenance
    controller: App\Controller\Maintenance\FlagController::flag

这只是一个渲染函数-我感觉这可能是导致问题的原因(重定向到flag()的无穷循环,然后执行前动作?),但我不确定如何渲染setResponse()方法中的模板

即使将路由配置文件注释掉,我仍然会收到错误消息。因此,不再100%肯定是flag()无穷循环理论

1 个答案:

答案 0 :(得分:0)

我确实对无限循环是个问题,添加此条件以排除/maintenance网址可​​以使其正常工作。

if (strpos($event->getRequest()->getRequestUri(), 'maintenance') !== false) {
    return;
}