使用事件侦听器重定向所有“未找到路由 404 未找到 - NotFoundHttpException”

2024-01-02

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

有很多例子,但我找不到“GetResponseForExceptionEvent”的例子。例如,当我通过@roter作为一个论点$this->router....似乎没有这样工作。

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

  • 显示特定路线而不是错误页面 (404) - Symfony2 https://stackoverflow.com/questions/15983082/show-a-specific-route-instead-of-error-page-404-symfony2
  • symfony2:挂钩 NotFoundHttpException 进行重定向 https://stackoverflow.com/questions/13564466/symfony2-hook-into-notfoundhttpexception-for-redirection
  • Symfony2 事件监听器重定向? https://stackoverflow.com/questions/12916439/symfony2-redirect-for-event-listener
  • Symfony2:在页面加载事件监听器中获取路由 https://stackoverflow.com/questions/11505287/symfony2-getting-route-in-page-load-event-listener/11506088#11506088
  • 如果用户已登录则重定向 https://stackoverflow.com/questions/10487557/redirect-if-the-user-is-logged-in

服务.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 个选择:

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

让我知道这是否有效。


Option 1

Note:看一下Symfony2 事件监听器重定向 https://stackoverflow.com/questions/12916439/symfony2-redirect-for-event-listener

1 Pass the router to your event listener:

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

2 Use the router within the listener to redirect users:

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);

        }
    }
} 

Option 2

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

1 At the end of 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

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用事件侦听器重定向所有“未找到路由 404 未找到 - NotFoundHttpException” 的相关文章

  • 如何使用 Doctrine 实体创建测试而不保留它们(如何设置 id)

    我正在为 Symfony2 项目进行测试 现在我正在寻找一种方法来创建涉及实体对象的测试而不保留它们 问题是 id是一个私有字段 并且没有设置器 我可以创建新对象并设置一些属性 但我无法测试涉及的任何内容getId calls entity
  • Symfony2 将复选框值从 0/1 更改为“no”/“yes”

    我创建了一个带有一个复选框的表单 用户设置类型 php public function buildForm FormBuilderInterface builder array options builder gt add newslett
  • php平台安装询问我intl扩展,但似乎已经安装

    在 orocrm 安装期间 使用 symfony 2 开发的平台 我收到此错误 Fatal error Uncaught exception Symfony Component Intl Exception MethodArgumentVa
  • Symfony 2 中实体管理器和 phpunit 的问题

    我的 phpunit 中的实体管理器有问题 这是我的测试 public function testValidChangeEmail client self createAuthClient user password crawler cli
  • symfony2形式选择和mongodb

    使用 Entity 时 我们可以从 Entity 加载选择via表单字段类型实体 builder gt add group entity array class gt Fist CoreBundle Document Group 但是当使用
  • Symfony2 - 多种形式的主题

    有没有办法在同一页面上的两个 或多个 表单使用不同的主题 我有 2 个表单 我想对第一个表单使用主题 X 对第二个表单使用主题 Y 您需要在显示表单之前声明您的主题 你应该试试 form theme form ThemeX html twi
  • Doctrine 自动递增起始值@ORM\GenelatedValue

    如何使用注释设置自动递增 id 的起始值 我希望它从 250000 开始 ORM Id ORM GeneratedValue ORM Column type integer protected id ORM Id ORM Generated
  • 如何自定义 FOS UserBundle URL

    我已经安装了FOS用户包 https github com FriendsOfSymfony FOSUserBundle我想将网址自定义为 account login account register account logout代替 lo
  • twig json_encode 空 json

    我正在从 API 接收元素列表 所有元素的格式都很好 当我使用树枝转储其中一个时 我得到以下信息 Leg 2695 id null reservation null airportStart AIX LES MILLES airplaneT
  • Symfony Finder 忽略以点开头的文件

    我使用 Finder 发送假脱机电子邮件 但自动名称生成器会在文件名中添加点 有时它们会出现在文件的开头 似乎查找器无法获取具有该名称的文件 那么这些文件是隐藏的 有人经历过这种行为吗 有什么建议如何使用查找器来查找隐藏文件吗 Thx 刚刚
  • 在 Symfony2 中使用 assetic 加载一个 js 文件

    我是 Symfony 2 的新手 之前我经常使用 Codeigniter 现在我正在探索 assetic 我无法理解如何将单个文件添加到已经加载的 JS 文件堆栈中 我有一个主页树枝文件 其中包含以下内容 javascripts BlogB
  • 使用自定义服务的编译器传递加载 Symfony 的参数

    根据这个问题如何从数据库加载 Symfony 的配置参数 Doctrine https stackoverflow com q 28713495 8945214我有一个类似的问题 我需要动态设置参数 并且我想提供来自另一个自定义服务的数据
  • Symfony2 Twig 扩展

    我在实现树枝扩展时遇到一些问题 我需要创建自己的过滤器 子过滤器 所以我想到了使用twig扩展 我在 MyApp Bundle WebsiteBundle 和文件上创建了一个名为 Extension 的文件夹 网站扩展 php namesp
  • 如何使用 Twig 的属性函数访问嵌套对象属性

    我试图使用一个树枝变量来访问另一个树枝变量的属性 直到我找到 属性 函数为止 该变量才起作用 除了需要访问嵌套属性的情况外 效果很好 当包含属性的变量实际上是对象 属性时 它不起作用 例如 attribute object1 variabl
  • Sonata DateTimePickerType 类默认日期显示错误的日期时间格式

    我陷入困境 我不知道如何使用 sonata DateTimePickerType 类正确设置默认日期和时间 我尝试了不同的方法 但到目前为止 没有一种方法没有帮助 在下面的截图中 help 键显示正确的日期和时间 但是当我使用 dp 默认日
  • 使用 Symfony 4 命令加载不同的 .env 文件

    env运行 Symfony 4 命令时会解析文件 如果 dotenv 可用 这在开发时工作正常 而且 我想测试我的代码 所以另一个环境 因此我需要加载另一个 env file 我喜欢 Docker 运行容器的方式 docker run e
  • 通过CompilerPass注册自定义AttributeBag

    我正在尝试通过将自定义 AttributBags 集成到会话中来整理我的会话变量 在 Symfony 查看相关问题 如何向 symfony 会话添加额外的包 https stackoverflow com questions 4472361
  • Symfony 2 使用 CSS 设置背景图片

    I want to put a background image for a menu in symfony But I can t figure out how to do it I managed to style a lot of t
  • 在 symfony2 中加载应用程序的自定义配置文件

    我正在开发一个symfony2应用程序 我试图包含我的自定义 yaml 配置位于 src AppBundle Resources Config general yml 我已按照此处提供的示例进行操作http symfony com doc
  • 如何使用变量处理树枝文件中的翻译?

    我有一个 twig 文件和一个 yml 在其中定义翻译变量 e g YML 文件 variable for translation Disponible para t Twig 文件的内容 h2 Hola Follow variableNa

随机推荐