为啥升级到 Symfony 4.4 后我不再看到错误预览页面?

Posted

技术标签:

【中文标题】为啥升级到 Symfony 4.4 后我不再看到错误预览页面?【英文标题】:Why after upgrading to Symfony 4.4 I no longer get the error preview pages?为什么升级到 Symfony 4.4 后我不再看到错误预览页面? 【发布时间】:2020-10-07 02:38:44 【问题描述】:

我刚刚将一个项目从 Symfony 4.3 更新到 4.4。更新后出现错误时,显示的页面是带有“糟糕!发生错误!”的生产错误页面,而不是带有所有错误痕迹的开发错误页面。

此外,分析器不会记录错误页面,我可以在分析器中看到所有请求,但看不到有错误的请求。

如果我查看日志(我正在使用 docker),我可以在那里看到 php 错误:

$ docker logs php
172.21.0.3 -  17/Jun/2020:09:50:53 +0000 "GET /index.php" 500
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Uncaught Twig\Error\SyntaxError: Unexpected "". in /app/templates/professionals/artists/list.html.twig:26"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "Stack trace:"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#0 /app/vendor/twig/twig/src/Lexer.php(292): Twig\Lexer->lexExpression()"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#1 /app/vendor/twig/twig/src/Lexer.php(186): Twig\Lexer->lexVar()"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#2 /app/vendor/twig/twig/src/Environment.php(542): Twig\Lexer->tokenize(Object(Twig\Source))"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#3 /app/vendor/twig/twig/src/Environment.php(595): Twig\Environment->tokenize(Object(Twig\Source))"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#4 /app/vendor/twig/twig/src/Environment.php(408): Twig\Environment->compileSource(Object(Twig\Source))"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#5 /app/vendor/twig/twig/src/Environment.php(381): Twig\Environment->loadClass('__TwigTemplate_...', 'professionals/a...', NULL)"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#6 /app/vendor/twig/twig/src/Environment.php(359): Twig\Environment->loadTemplate('professionals/a...')"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#7 /app/vendor/symfony/twig-bridge/TwigEngine.php(135): Twig\Environment->load('professionals/a...')"
[17-Jun-2020 09:50:53] WARNING: [pool www] child 6 said into stderr: "#8 /app/vendor/symfony/twig-bridge/TwigEngine.php(54): Symfony\Bridge\Twig\TwigEngine->load(..."

.env 文件设置为APP_ENV=dev

【问题讨论】:

您没有任何其他 dotenv 文件覆盖原始 .env 吗?像.env.local 是的,我有一个 env.local 但没有覆盖任何 symfony 变量。当页面正确加载时,我还可以在页面底部看到分析器栏。 是的,但它仍然无法正常工作:( 【参考方案1】:

Debug 类已从 Symfony\Component\Debug\Debug 更改 到 Symfony 4.4 中的 Symfony\Component\ErrorHandler\Debug

因此您必须更改您的app_dev.php 和其他调试前端控制器,以便Debug::enable() 导致新的。

https://github.com/symfony/symfony/issues/36254#issuecomment-701260396

【讨论】:

【参考方案2】:

发现错误。这是 FosRestBundle 包的错误配置。

我在 2.5 版有friendsofsymfony/rest-bundle。我升级到 2.8 并在 fos_rest-yml 中删除了配置“exception_controller: 'fos_rest.exception.controller:showAction”。

之后一切都恢复正常了。

【讨论】:

【参考方案3】:

在 Symfony 4.4 中发布了 ErrorHandler 组件,that replaced the Debug component。

这样,一些文件的位置发生了变化。

您需要找到config/routes/dev/twig.yaml,并删除这些行:

# config/routes/dev/twig.yaml
_errors:
    resource: '@TwigBundle/Resources/config/routing/errors.xml'
    prefix:   /_error

用这个内容创建一个新文件config/routes/dev/framework.yaml

# config/routes/dev/framework.yaml
_errors:
    resource: '@FrameworkBundle/Resources/config/routing/errors.xml'
    prefix:   /_error

这应该会在开发过程中恢复旧的错误预览页面。

【讨论】:

您好,感谢您的评论,但是在进行更改后调试错误页面仍然没有显示,我还清除了缓存并删除了所有供应商文件夹并再次安装但仍然是生产错误页面已显示。

以上是关于为啥升级到 Symfony 4.4 后我不再看到错误预览页面?的主要内容,如果未能解决你的问题,请参考以下文章

为啥升级到 ios-sdk8 后我的 UIImageView 不会拉伸?

为啥我升级到 MVC3 后我的自定义 HtmlHelpers 停止工作?

当我尝试通过更改 `extra.symfony.require` 来升级 Symfony 时,为啥会出现此错误?

为啥在 Jquery 中添加“阻止程序”类后我的事件绑定不再触发?

Symfony 4.4 metadata_cache_driver 配置键弃用通知

用户测试中多个客户端的 Symfony 4.4 弃用警告已弃用,但仍存在于文档中