如何自定义错误页面

<一个类="doc-action content-edit" href="https://github.com/symfony/symfony-docs/edit/2.8/controller/error_pages.rst"> 编辑本页

警告:您正在浏览的文档欧宝体育电话<一个href="//www.oldmanjams.com/releases/2.8">欧宝娱乐app下载地址Symfony 2.8,现已不再维护。

读<一个href="//www.oldmanjams.com/doc/current/controller/error_pages.html">本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

开发环境, 欧宝娱乐app下载地址Symfony捕获所有异常并显示一个特殊异常异常页面大量的调试信息,帮助您快速发现根本问题:

开发环境中的典型异常页面"一个lign=

由于这些页面包含大量敏感的内部信息,Symfony不会在生产环境中显示它们。欧宝娱乐app下载地址相反,它将显示一个简单而通用的错误页面

生产环境中的典型错误页面"一个lign=

生产环境的错误页面可以根据您的需要以不同的方式定制:

  1. 如果您只是想更改错误页面的内容和样式以匹配应用程序的其余部分,<一个href="//www.oldmanjams.com/doc/2.8/controller/error_pages.html" class="reference internal">重写默认错误模板
  2. 如果您还想调整Symfony用于生成错误页面的逻辑,欧宝娱乐app下载地址<一个href="//www.oldmanjams.com/doc/2.8/controller/error_pages.html" class="reference internal">重写默认异常控制器
  3. 如果你需要完全控制异常处理来执行你自己的逻辑<一个href="//www.oldmanjams.com/doc/2.8/controller/error_pages.html" class="reference internal">使用内核。异常事件

error404.html.twig模板位于app /资源/ / TwigBundle /视图/异常

1 2 3 4 5 6 7 8 9 10 11
{# app /资源/ / error404.html TwigBundle /视图/异常。树枝#}{%扩展“base.html。嫩枝' %}{%身体%}<h1>未找到页面h1><p>无法找到所请求的页面。检查任何URL拼写错误或<一个href{{path('主页')}}>返回主页一个>p>{%endblock%}

如果你需要的话,这个ExceptionController方法将一些信息传递给错误模板status_code而且status_text分别存储HTTP状态代码和消息的变量。

提示

您可以通过实现自定义状态代码<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php" class="reference external" title="HttpExceptionInterface"rel="external noopener noreferrer" target="_blank">HttpExceptionInterface这是必须的getStatusCode ()方法。否则,status_code将默认为500

请注意

开发环境中显示的异常页面可以按照与错误页面相同的方式进行定制。创建一个新的exception.html.twig模板的标准HTML异常页面或exception.json.twigJSON异常页面。

ExceptionController允许您预览您的错误开发中的页面。

要使用此特性,您需要在您的routing_dev.yml文件是这样的:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / routing_dev.yml_errors:资源:“@TwigBundle /资源/ config /路由/ errors.xml”前缀:/ _error

如果您使用的是旧版本的Symfony,则可能需要将此添加到您的欧宝娱乐app下载地址routing_dev.yml文件。如果你是从零开始,那么<一个href="https://github.com/symfony/symfony-standard/" class="reference external" rel="external noopener noreferrer" target="_blank">欧宝娱乐app下载地址Symfony标准版已经为您包含了它。

添加此路由后,您可以使用类似于

1 2
http://localhost/app_dev.php/_error/ {statusCode} http://localhost/app_dev.php/_error/ {statusCode}}{格式。

要预览错误页面为给定的状态代码HTML或给定的状态代码和格式。

twig.exception_controller配置选项指向它:

  • YAML
  • XML
  • PHP
1 2 3
# app / config / config.yml枝:exception_controller:AppBundle:例外:showException

的<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php" class="reference external" title="ExceptionListener"rel="external noopener noreferrer" target="_blank">ExceptionListener类被TwigBundle用作侦听器kernel.exception事件创建将分派给控制器的请求。此外,你的控制器将被传递两个参数:

异常
一个<一个href="https://github.com/symfony/symfony/blob/2.8/src//Symfony/Component/Debug/Exception/FlattenException.php" class="reference external" title="FlattenException"rel="external noopener noreferrer" target="_blank">FlattenException从正在处理的异常创建的实例。
日志记录器
一个<一个href="https://github.com/symfony/symfony/blob/2.8/src//Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php" class="reference external" title="DebugLoggerInterface"rel="external noopener noreferrer" target="_blank">DebugLoggerInterface实例,可能是在某些情况下。

当然,您也可以扩展默认值,而不是从头创建一个新的异常控制器<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php" class="reference external" title="ExceptionController"rel="external noopener noreferrer" target="_blank">ExceptionController.在这种情况下,您可能希望重写一个或两个showAction ()而且findTemplate ()方法。后者定位要使用的模板。

请注意

如果要扩展<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php" class="reference external" title="ExceptionController"rel="external noopener noreferrer" target="_blank">ExceptionController你可以配置一个服务来传递Twig环境和调试标记到构造函数。

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / services.yml服务:app.exception_controller:类:AppBundle \ \ CustomExceptionController控制器参数:[' @twig ',“% kernel.debug %”

然后进行配置twig.exception_controller使用控制器作为服务语法(例如:app.exception_controller: showAction).

提示

的<一个href="//www.oldmanjams.com/doc/2.8/controller/error_pages.html" class="reference internal">错误页面预览也适用于您自己的控制器设置这种方式。

kernel.exception事件

异常抛出时,<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpKernel/HttpKernel.php" class="reference external" title="HttpKernel"rel="external noopener noreferrer" target="_blank">HttpKernel类捕获它并分派kernel.exception事件。这使您能够将异常转换为响应以几种不同的方式。

处理这个事件实际上比前面解释的要强大得多,但也需要对Symfony内部机制有透彻的理解。欧宝娱乐app下载地址假设您的代码抛出对应用程序域具有特定含义的专门化异常。

<一个href="//www.oldmanjams.com/doc/2.8/event_dispatcher.html" class="reference internal">编写自己的事件侦听器kernel.exception事件允许您更仔细地查看异常,并根据它采取不同的操作。这些操作可能包括记录异常、将用户重定向到另一个页面或呈现专门的错误页面。

请注意

如果你的听众打电话setResponse ()在<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php" class="reference external" title="GetResponseForExceptionEvent"rel="external noopener noreferrer" target="_blank">GetResponseForExceptionEvent,事件,传播将停止,并将响应发送到客户端。

这种方法允许您创建集中的和分层的错误处理:而不是一次又一次地在各种控制器中捕获(和处理)相同的异常,您可以只用一个(或几个)侦听器来处理它们。

提示

看到<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Security/Http/Firewall/ExceptionListener.php" class="reference external" title="ExceptionListener"rel="external noopener noreferrer" target="_blank">ExceptionListener此类高级侦听器的实际示例的类代码。这个侦听器处理应用程序中抛出的各种与安全性相关的异常(例如<一个href="https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Security/Core/Exception/AccessDeniedException.php" class="reference external" title="AccessDeniedException"rel="external noopener noreferrer" target="_blank">AccessDeniedException),并采取措施,如重定向用户到登录页面,注销他们和其他事情。

此工作,包括代码示例,是根据<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">创作共用BY-SA 3.0许可证。