为什么Symfony 3.4在PHP通知中抛出ContextErrorException,而Symfony 2.8在同一



我正在将Symfony 2.8项目迁移到Symfony 3.4。虽然整个过程非常直接,但我在一点上遇到了困难:

虽然显示的代码在Symfony 2.8上运行时没有任何问题,但它在Symfony 3.4上以ContextErrorException失败。该代码来自一个"Catch-all"控制器,该控制器处理对任何其他路由都无法处理的URL的调用:

public function catchallAction(Request $request) {
$url = $_SERVER['REQUEST_URI'];     
// Try to find a solution, e.g. by adding / replacing the locale
if (1 === preg_match('/(/app_dev.php)?(/([a-z]{2}))?(((/([^/]+))?(/[^?]+))(?(.+))?)/', $url, $matches)) {
$this->logger->info('catchallAction');
$this->logger->info("   $url");
foreach ($matches as $key => $value)
$logger->info("   $key => $value");
$locale = (isset($matches[3]) ? $matches[3] : null);
$subdir = (isset($matches[7]) ? $matches[7] : null);
$path = $matches[5];
$query = $matches[10]; 
// ==> Exception in Symfony 3.4
...
}
...
}
// Log output
catchallAction
/app_dev.php/logout
0 => /app_dev.php/logout
1 => /app_dev.php
2 =>  
3 =>  
4 => /logout 
5 => /logout  
6 =>  
7 =>  
8 => /logout 

异常消息是正确的,$matches数组中没有索引10但是,我不明白为什么这会在`Symfony中引发异常

  • 两个项目运行完全相同的服务器
  • 两个项目都使用完全相同的PHP版本和完全相同的PHP.ini
  • 在.htaccess文件中更改/添加PHP.ini设置的两个项目(据我所见(

因此,当两个项目在同一环境中运行时,Symfony 2.8运行良好,而Symfony 3.4在PHP通知中抛出异常。甚至不是一个错误或警告,只是一个通知。这怎么可能发生,如何解决?

Symfony 3.8是否还有其他配置文件可以更改PHP设置?

我设法找到了解决方案:

Symfony 3.2引入了debug.error_handler.throw_at参数,该参数控制引发异常的PHP错误(警告、通知等(。

只需在config_dev.yml中添加以下内容,即可仅在出现错误时抛出异常。也许这个答案可以帮助其他人腾出一些时间:-(

parameters:
# Avoid Symfony exceptions on PHP Warnings, Notices, etc., just handele error
# PHP E_ERROR = 1
debug.error_handler.throw_at: 1

最新更新