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()
方法中执行。
另见
我正在使用 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()
方法中执行。