如何在symfony 2.x中实现每包404页

如何在symfony 2.x中实现每包404页,symfony,Symfony,在我正在处理的一个项目中,需要为每个包实现一个定制的404页面 在内部,没有提及此类功能 我和一些同事讨论了这个问题,他们告诉我它必须使用kernel.exception事件,可惜这个事件缺少bundle调用它的信息 IMHO这应该通过在symfony路由器组件上应用补丁来解决,这将允许开发人员指定可以进一步处理该情况的所有捕获路由 另一个选项是更改RouterInterface::match方法的行为,以返回包含匹配路径和匹配路径的包的一致输出。目前这是不可能的,因为如果匹配失败,它会抛出一个

在我正在处理的一个项目中,需要为每个包实现一个定制的404页面

在内部,没有提及此类功能

我和一些同事讨论了这个问题,他们告诉我它必须使用kernel.exception事件,可惜这个事件缺少bundle调用它的信息

IMHO这应该通过在symfony路由器组件上应用补丁来解决,这将允许开发人员指定可以进一步处理该情况的所有捕获路由

另一个选项是更改RouterInterface::match方法的行为,以返回包含匹配路径和匹配路径的包的一致输出。目前这是不可能的,因为如果匹配失败,它会抛出一个异常,并且不会给您任何信息,尽管它可以

例如,我有一个ApiBundle,它被定义为处理以“/api”开头的URL。目前,处理这个问题并设置自定义404页面的唯一方法是在执行kernel.exception和preg_match()url时获取请求。但是,这是应该避免的硬编码,因为捆绑包不应该有这样的知识-它是在app/config/routing文件下定义的

你的意见是什么?

我也希望能有其他的解决办法。

我最终实现了我的定制,即发送一个我称为“ourCompany.exception\u response”的事件

  • 默认捆绑包具有优先级为-1024的侦听器集
  • 如果自定义包处理异常并设置其响应,则必须标记事件并停止传播
  • 定制包可以使用服务容器获取它想要的任何内容,以确定是否处理异常

用一个空白的细枝文件覆盖
app/Resources/TwigBundle/views/Exception
中的模板,然后在包中进行扩展,怎么样?有什么意义?应用程序/资源文件用于在应用捆绑包后覆盖所有内容。即使我从包中扩展文件,它也不会被加载。你的目标是为每个包实现一个自定义404页面,对吗?如果您在文件
app/Resources/TwigBundle/views/Exception/error404.html.twig
中放置一个类似
{%block content%}{%endblock%}
的块,然后在每个包中创建一个从它扩展并写入该块的twig文件。我还没有测试过,但这样做对我来说是有意义的。我想我错了。我发现并说没有简单的方法可以做到这一点。。。