首页 > 解决方案 > 自定义页面错误不起作用。(在生产中总是返回代码 500)

问题描述

所以我正在做一个项目,我想制作像 404 500 这样的自定义错误页面......

所以我阅读了 symfony 文档,我所要做的就是 c omposer twig-pack,然后error404.html.twig在这个树目录中添加\templates\bundles\TwigBundle\Exception。要完成,我必须在 prod 中更改我的 .env 才能看到我的美容错误页面。

但是当我尝试输入错误的 url 期望得到我的 404 时,我得到了 500(来自 symfony 的基本错误页面)。

我检查了我的日志,发现我收到了这个严重错误:

[2021-07-14T08:35:15.194689+00:00] request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException: "No route found for "GET https://micro59/dejifosd"" at C:\wamp\www\Projects\micropro\vendor\symfony\http-kernel\EventListener\RouterListener.php line 136 {"exception":"[object] (Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException(code: 0): No route found for \"GET https://micro59/dejifosd\" at C:\\wamp\\www\\Projects\\micropro\\vendor\\symfony\\http-kernel\\EventListener\\RouterListener.php:136)\n[previous exception] [object] (Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException(code: 0): No routes found for \"/dejifosd/\". at C:\\wamp\\www\\Projects\\micropro\\vendor\\symfony\\routing\\Matcher\\Dumper\\CompiledUrlMatcherTrait.php:70)"} []
[2021-07-14T08:35:15.229712+00:00] php.CRITICAL: Uncaught Error: Symfony\Bridge\Twig\Extension\RoutingExtension::getPath(): Argument #1 ($name) must be of type string, null given, called in C:\wamp\www\Projects\micropro\var\cache\prod\twig\d5\d51256555fdd9ed9db40150aba9ba2f8325c04e57ae45e60937191a29447ddd2.php on line 37 {"exception":"[object] (TypeError(code: 0): Symfony\\Bridge\\Twig\\Extension\\RoutingExtension::getPath(): Argument #1 ($name) must be of type string, null given, called in C:\\wamp\\www\\Projects\\micropro\\var\\cache\\prod\\twig\\d5\\d51256555fdd9ed9db40150aba9ba2f8325c04e57ae45e60937191a29447ddd2.php on line 37 at C:\\wamp\\www\\Projects\\micropro\\vendor\\symfony\\twig-bridge\\Extension\\RoutingExtension.php:46)"} []
[2021-07-14T08:35:15.232242+00:00] request.CRITICAL: Uncaught PHP Exception TypeError: "Symfony\Bridge\Twig\Extension\RoutingExtension::getPath(): Argument #1 ($name) must be of type string, null given, called in C:\wamp\www\Projects\micropro\var\cache\prod\twig\d5\d51256555fdd9ed9db40150aba9ba2f8325c04e57ae45e60937191a29447ddd2.php on line 37" at C:\wamp\www\Projects\micropro\vendor\symfony\twig-bridge\Extension\RoutingExtension.php line 46 {"exception":"[object] (TypeError(code: 0): Symfony\\Bridge\\Twig\\Extension\\RoutingExtension::getPath(): Argument #1 ($name) must be of type string, null given, called in C:\\wamp\\www\\Projects\\micropro\\var\\cache\\prod\\twig\\d5\\d51256555fdd9ed9db40150aba9ba2f8325c04e57ae45e60937191a29447ddd2.php on line 37 at C:\\wamp\\www\\Projects\\micropro\\vendor\\symfony\\twig-bridge\\Extension\\RoutingExtension.php:46)"} []

Aaaaaaaand 这就是我卡住的地方。我尝试了很多事情(作曲家更新,清除缓存......)但没有任何改变。如果有人愿意帮助我,那将不胜感激。

标签: twigsymfony5

解决方案


错误消息中的类 & 方法RoutingExtension::getPath()定义了一个 Twig 函数 - path()。您的 error404.html.twig 文件使用该函数,但没有所需的第一个参数('name',路由名称) - 或者传递给它的值是 null。


How to Customize Error Pages有一个简单的错误页面模板,并有一个示例路径/路由名称{{ path('homepage') }}

您可以获得到目前为止可用的路由列表bin/console debug:router- 框架必须知道它,否则它将引发关于未知路由的错误。

它还有一个 .yaml 可用于使错误页面在开发中可用(您的控制器很好,这将更清洁和更容易 - 并且仅在开发中可用,因为 config/ 目录中的路径仅当您的 APP_ENV 变量为“dev”时读取)。

如果你还没有,composer require debug-pack并且任何错误——包括在你的“/error404”页面上都会显示一个“大的友好错误页面”,还应该添加很多有用的信息——通常包括在 twig 模板中显示文件和行。

在这个特殊的例子中,由于错误的类型,它不能因为它在 Twig 库内部很深(并且来自 PHP 类型系统,而不是 Symfony 或 Twig 直接发现的错误) - 但它会有一个堆栈跟踪中的链接以显示已编译的 twig 模板(在 ./var/cache/dev/twig/../.......php 中的随机命名文件中),并显示它在 twig 模板中调用的位置->getPath();- 这样您就可以在实际的 .twig 文件中跟踪它(它为模板中的行号添加注释以提供帮助)。


推荐阅读