使用事件侦听器重定向所有“未找到路由 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” 的相关文章

  • twig json_encode 空 json

    我正在从 API 接收元素列表 所有元素的格式都很好 当我使用树枝转储其中一个时 我得到以下信息 Leg 2695 id null reservation null airportStart AIX LES MILLES airplaneT
  • 如何配置 FOSRestBundle 以不干扰自定义异常控制器

    我刚刚将我的 Symfony 2 7 页面更新到 2 8 除了 Symfony 本身之外 许多其他软件包也已更新 FOSRestBundle已从1 4版本更新至2 1版本 更新后CustomExceptionController我配置为Tw
  • Symfony Doctrine 数据类型仅适用于 findBy 不适用于 querybuilder

    我有自定义数据类型 它在使用 FindBy 时按预期工作 但在使用查询生成器时却不然 很抱歉这篇文章很长 但我认为更多信息应该有所帮助 这与这个未回答的问题相同 学说 2 自定义类型 https stackoverflow com ques
  • Symfony Finder 忽略以点开头的文件

    我使用 Finder 发送假脱机电子邮件 但自动名称生成器会在文件名中添加点 有时它们会出现在文件的开头 似乎查找器无法获取具有该名称的文件 那么这些文件是隐藏的 有人经历过这种行为吗 有什么建议如何使用查找器来查找隐藏文件吗 Thx 刚刚
  • 如何使用symfony2中的findOneBy方法返回数组而不是对象?

    我有一种情况 我想使用 symfony2 中的 findOneBy id 方法查询数据库 namePosting this gt getDoctrine gt getRepository MyBundle Users gt findOneB
  • 在 Symfony2 中使用 assetic 加载一个 js 文件

    我是 Symfony 2 的新手 之前我经常使用 Codeigniter 现在我正在探索 assetic 我无法理解如何将单个文件添加到已经加载的 JS 文件堆栈中 我有一个主页树枝文件 其中包含以下内容 javascripts BlogB
  • Symfony2 功能测试会话持久性

    我正在尝试在 Symfony 中进行一些功能测试 但目前我的会话遇到了问题 我执行了一段代码 它似乎有效 但容器的会话中没有存储任何内容 我有一个表格 您可以在其中设置数据 当您提交它时 它会检查值并将其存储在会话中 然后它重定向到另一个页
  • 安装 Symfony 2.4.1 lib-icu 4.4 依赖项时出现问题

    我遇到了与以下相同的问题this one https stackoverflow com questions 16753105 problems with lib icu dependency when installing symfony
  • 通过CompilerPass注册自定义AttributeBag

    我正在尝试通过将自定义 AttributBags 集成到会话中来整理我的会话变量 在 Symfony 查看相关问题 如何向 symfony 会话添加额外的包 https stackoverflow com questions 4472361
  • 安全性:密码检查删除和自定义用户提供程序

    我正在创建 Symfony2 版本 2 0 16 custom User Provider与我们的 LDAP 服务器一起使用 但根据如何创建自定义用户提供者 http symfony com doc 2 0 cookbook securit
  • Doctrine EntityManager 清除嵌套实体中的方法

    我想用学说批量插入处理 http doctrine orm readthedocs org en latest reference batch processing html为了优化大量实体的插入 问题出在 Clear 方法上 它表示此方法
  • 如何让 Symfony 表单与 REST API 配合使用?

    我目前正在尝试让 symfony 表单与我的帖子一起使用并放置其余 api 端点 目前我有 request this gt getRequest cc new CreditCard form this gt createForm new C
  • Symfony2 - 操纵来自内核异常侦听器的请求/响应

    我正在为网站构建一个管理面板 我想更改发生 404 异常时调用的视图but only对于管理应用程序 path admin 我已经做过头了error404 html twig查看 在app Resources TwigBundle view
  • 在 Symfony2 dev env 控制器中捕获 swiftmailer 异常

    我不知道为什么我没有在我的控制器中捕获 Swiftmailer 的异常 我做错了什么 或者错过了什么 在控制器中我有 try this gt get mailer gt send email catch Swift TransportExc
  • 在 Twig 模板中的翻译内容中添加链接

    在 Twig 模板中 我需要一个包含链接的翻译文本 路径应该由路由器生成 而不是静态嵌入 Twig 不允许在 trans 块内渲染变量 我还知道以下内容 trans with name Fabien from app Hello name
  • JMSSerializer + 表单/数组

    我是 SF2 社区的新手 所以请放轻松 我遇到了 JMSSerializerBundle 和表单 数组的问题 我花了两天时间尝试自己解决这个问题 但没有成功 我决定将其发布到小组中 我正在构建一个简单的测试应用程序 它可以让我了解这些东西是
  • Doctrine2 命名查询

    我在 Doctrine2 中找不到任何有关命名查询的文档 请帮忙 Doctrine2 有命名查询功能吗 您可以使用 命名查询 DQL 例子 use Doctrine ORM Mapping NamedQuery use Doctrine O
  • Symfony2 的 mongoDB 返回一个可记录游标而不是我的实体

    我目前使用 DoctrineMongoDbBundle 向我的 mongodb 数据库发出请求 这是我的控制器中的调用 dm this gt get doctrine odm mongodb document manager entitie
  • 如何扩展 Sonata\DoctrineORMAdminBundle\Model\ModelManager

    我想在 ModelMangaer 中进行一些更改 然后我扩展了 ModelManager 但它不起作用 我不知道为什么 有人告诉我为什么它不起作用吗 我扩展 Sonata DoctrineORMAdminBundle Model Model
  • Symfony php.ini Debian

    我在 Oracle VM VirtualBox 上使用 Debian 7 amd64 LAMP 服务器 我正在尝试安装 Symfony 但遇到了一些小问题 当我运行命令时 php my project name app check php

随机推荐