Cakephp 3.0:关闭或禁用特定控制器的堆栈跟踪运行时

Cakephp 3.0:关闭或禁用特定控制器的堆栈跟踪运行时,php,cakephp,error-handling,runtime,Php,Cakephp,Error Handling,Runtime,我使用的是CakePHP3.0框架,如果出现异常或错误,需要禁用/关闭堆栈跟踪 我试着给出解决方案 如果我在MyProject\config\app.php文件中进行更改,则所有控制器的堆栈跟踪都将关闭,但如果我使用以下代码针对特定控制器错误设置trace=false,则堆栈跟踪将被设置为false,但堆栈跟踪未被禁用 <?php namespace App\Shell; use Cake\Core\Configure; use Cake\Console\Shell; Configur

我使用的是CakePHP3.0框架,如果出现异常或错误,需要禁用/关闭堆栈跟踪

我试着给出解决方案

如果我在MyProject\config\app.php文件中进行更改,则所有控制器的堆栈跟踪都将关闭,但如果我使用以下代码针对特定控制器错误设置trace=false,则堆栈跟踪将被设置为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中,是否有其他方法可以禁用特定控制器/外壳文件的堆栈跟踪,而不是从app.php进行设置?

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

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

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

一个快速而肮脏的解决方案是通过
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()
方法中执行此操作

另见
错误选项只读取一次 与其他一些选项一样,
Error
选项不能通过
Configure
类在运行时更改。虽然这些选项没有被使用,但错误处理程序在引导时只读取它们一次,因此在以后更改它们不会有任何效果,请参阅您的应用程序
config/bootstrap.php

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

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

一个快速而肮脏的解决方案是通过
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()
方法中执行此操作

另见