我最近一直在研究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()
无穷循环理论
答案 0 :(得分:0)
我确实对无限循环是个问题,添加此条件以排除/maintenance
网址可以使其正常工作。
if (strpos($event->getRequest()->getRequestUri(), 'maintenance') !== false) {
return;
}