为什么 Symfony 3.4 在 PHP 通知上抛出 ContextErrorException 而 Symfony 2.8 在相同的代码上运行良好?

And*_*ord 2 php symfony

我正在将Symfony 2.8项目迁移到Symfony 3.4. 虽然整个过程非常简单,但我有一点绊倒了:

虽然显示的代码运行没有任何问题,Symfony 2.8但它Symfony 3.4ContextErrorException. 代码来自“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 
Run Code Online (Sandbox Code Playgroud)

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

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

因此,虽然两个项目都在同一环境中Symfony 2.8运行,但运行良好,但Symfony 3.4会在 PHP 通知上引发异常。甚至不是错误或警告,而只是一个通知。这怎么可能以及如何解决这个问题?

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

And*_*ord 5

我设法找到了解决方案:

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
Run Code Online (Sandbox Code Playgroud)