自定义页面错误不起作用。 (在生产中总是 return 代码 500)

Custom page Error doesn't work. (in production always return code 500)

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

所以我在 symfony 文档上读到我所要做的就是 composer twig-pack,然后在这个树目录 \templates\bundles\TwigBundle\Exception 中添加 error404.html.twig。最后,我必须更改 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)"} []

Aaaaaaa 这就是我卡住的地方。我尝试了很多东西(Composer 更新、清除缓存...)但没有任何改变。如果有人好心帮助我,将不胜感激。

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


How to Customize Error Pages 有一个简单的错误页面模板,并有一个示例 path/route-name {{ path('homepage') }}.

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

它还有一个 .yaml 文件,您可以使用它来使错误页面在开发中可用(您的控制器很好,这会更简洁、更容易一些——并且仅在开发中可用,因为只有当你的 APP_ENV 变量是 'dev').

时才会读取 config/ 目录

如果您还没有,composer require debug-pack 和任何错误 - 包括在您的 '/error404' 页面上将显示 'big friendly error page',还应该添加很多有用的信息 - 通常包括显示树枝模板中的文件和行。

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