twig - 自定义页面错误不起作用。(在生产中总是返回代码 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 这就是我卡住的地方。我尝试了很多事情(作曲家更新,清除缓存......)但没有任何改变。如果有人愿意帮助我,那将不胜感激。
解决方案
错误消息中的类 & 方法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 文件中跟踪它(它为模板中的行号添加注释以提供帮助)。
推荐阅读
- scala - 使用存储为通配符 classTag 的类型调用模板 Scala 函数?
- android - 如何验证改造时的空或空返回?
- flutter - 为什么文档firebase中的元数据不初始化?
- node.js - 如何在没有全局的情况下安装 ember-cli 版本 1.13.11?
- pandas - 快速替换 Pandas DataFrame 中的值
- javascript - 有没有我可以使用 mongo 在节点 js 中查询下一个集合?
- regex - json schema 可以验证多个正则表达式并返回不同的错误信息吗?
- ruby-on-rails - 在 Ruby 上为哈希编写自定义方法?在铁轨上
- python - 带有属性而不是元素的 Json 到 XML
- python - Pandas 日期时间数据框