Cakephp 3.0:关闭或禁用特定控制器的堆栈跟踪运行时
我使用的是CakePHP3.0框架,如果出现异常或错误,需要禁用/关闭堆栈跟踪 我试着给出解决方案 如果我在MyProject\config\app.php文件中进行更改,则所有控制器的堆栈跟踪都将关闭,但如果我使用以下代码针对特定控制器错误设置trace=false,则堆栈跟踪将被设置为false,但堆栈跟踪未被禁用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
<?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()
方法中执行此操作
另见