rout-6ren">
gpt4 book ai didi

symfony - 使用事件监听器重定向所有 "No route found 404 Not Found - NotFoundHttpException"

转载 作者:行者123 更新时间:2023-12-02 10:35:40 25 4
gpt4 key购买 nike

如何在事件监听器中触发重定向到特定路由器?

有很多示例,但我找不到“GetResponseForExceptionEvent”的示例。例如,当我将 @roter 作为参数传递时,$this->router.... 似乎不起作用。

我检查了这些,但我可能错过了一些东西:

service.yml

services:
kernel.listener.kernel_request:
class: Booking\AdminBundle\EventListener\ErrorRedirect
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

事件监听器:

namespace Booking\AdminBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class ErrorRedirect
{
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();

if ($exception instanceof NotFoundHttpException) {
// redirect to '/' router or '/error'
//$event->setResponse(...........);
}
}
}

最佳答案

您有 2 个选择:

  • 使用事件监听器
  • 使用与所有不存在的路由相匹配的路由,并在 Controller 中触发操作。

让我知道这是否有效。

<小时/>

选项 1

注意:看看 Symfony2 redirect for event listener

1 将路由器传递给您的事件监听器:

kernel.listener.kernel_request:
class: Booking\AdminBundle\EventListener\ErrorRedirect
arguments:
router: "@router"
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

2 使用监听器内的路由器重定向用户:

namespace Booking\AdminBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Routing\Router;

class ErrorRedirect
{
/**
* Holds Symfony2 router
*
*@var Router
*/
protected $router;

/**
* @param Router
*/
public function __construct(Router $router)
{
$this->router = $router;
}


public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();

if ($exception instanceof NotFoundHttpException) {

/** Choose your router here */
$route = 'route_name';

if ($route === $event->getRequest()->get('_route')) {
return;
}

$url = $this->router->generate($route);
$response = new RedirectResponse($url);
$event->setResponse($response);

}
}
}
<小时/>

选项 2

您可以创建一个特殊的路由来匹配所有不存在的路由;然后,您可以在您选择的 Controller 中按照您想要的方式处理重定向,此处为 PageNotFoundController:

1 在 app/config/routing.yml 末尾

pageNotFound:
pattern: /{path}
defaults: { _controller: AcmeDemoBundle:PageNotFound:pageNotFound, path: '' }
requirements:
path: .*

2

<?php

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class PageNotFoundController extends Controller
{

public function pageNotFoundAction()
{
// redirect the way you want

}

}

关于symfony - 使用事件监听器重定向所有 "No route found 404 Not Found - NotFoundHttpException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26464624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com