Cakephp 3.0:关闭或禁用特定控制器的 Stack Trace 运行时

Cakephp 3.0: Turn off or disable Stack Trace runtime for specific controller

我正在使用 CakePHP 3.0 框架,如果发生异常或错误,我需要 disable/turn 关闭 Stack Trace。

我尝试了 Turn on /off the debug mode for particular controller in cakephp 上给出的解决方案。

如果我在 MyProject\config\app.php 文件中进行更改,所有控制器的堆栈跟踪都会关闭,但如果我使用以下代码为特定控制器设置 trace = false Error.trace设置为 false 但未禁用堆栈跟踪。

<?php
namespace App\Shell;

use Cake\Core\Configure;
use Cake\Console\Shell;

Configure::write('Error.trace', false);

class MyClassShell extends Shell {

    public function main() {
        echo 'Error.trace...' . Configure::read('Error.trace'); // output is false
        ...
    }
}
?>

看到即使 Error.trace 为 False 仍然打印堆栈跟踪也很奇怪。

他们是否有任何其他方法可以在 Cakephp 3.0 中为特定 controller/shell 文件禁用 Stack Trace,而不是从 app.php 中设置它?

错误选项只被读取一次

与其他一些选项一样,Error 选项不能通过 Configure class 在运行时更改。虽然这些选项未被使用,但错误处理程序仅在引导时读取它们一次,因此稍后更改它们无效,请参阅您的应用程序 config/bootstrap.php

// ...
(new ConsoleErrorHandler(Configure::read('Error')))->register();
// ...

https://github.com/cakephp/app/blob/3.2.6/config/bootstrap.php#L116-L120

使用自定义错误处理程序

为了在运行时更改错误处理程序行为,您需要使用支持它的 custom/extended 错误处理程序,然后直接更改它,或让它动态读取选项。为了让前者工作(这是更简单的方法,因为它不需要重新实现一堆代码),您必须存储对处理程序的引用,以便稍后访问。

支持更改选项的基本自定义错误处理程序可能如下所示(* 请注意,这是所有未经测试的示例代码

namespace App\Console;

use Cake\Console\ConsoleErrorHandler;

class AppConsoleErrorHandler extends ConsoleErrorHandler
{
    public function setOption($key, $value)
    {
        $this->_options[$key] = $value;
    }
}

一个快速而肮脏的解决方案是通过 Configure 存储引用,例如

use App\Console\AppConsoleErrorHandler;

// ...

if ($isCli) {       
    $handler = new AppConsoleErrorHandler(Configure::read('Error'));
    $handler->register();
    Configure::write('Error.handler', $handler);
} else {
    (new ErrorHandler(Configure::read('Error')))->register();
}

// ...

然后在您的 shell 中访问并重新配置它,例如

$handler = Configure::read('Error.handler');
$handler->setOption('trace', false);

但不要像您的示例那样在文件级别执行此操作,而是在构造函数或 main() 方法中执行。

另见