Я использую CakePHP 3.0 framework и мне нужно отключить / отключить Stack Trace, если возникает исключение или ошибка.
Я попробовал решение, данное на Включить / выключить режим отладки для конкретного контроллера в 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, все равно выводятся следы стека.
Есть ли другой способ отключить Stack Trace в Cakephp 3.0 для определенного файла контроллера / оболочки вместо установки его из app.php?
Как и некоторые другие варианты, Error
параметры не могут быть изменены с помощью Configure
учебный класс. Хотя эти параметры не используются, обработчик ошибок читает их только один раз во время начальной загрузки, и, следовательно, изменение их на более поздний момент не имеет никакого эффекта, смотрите ваши приложения config/bootstrap.php
// ... (new ConsoleErrorHandler(Configure::read('Error')))->register(); // ...
https://github.com/cakephp/app/blob/3.2.6/config/bootstrap.php#L116-L120
Чтобы изменить поведение обработчика ошибок во время выполнения, вам нужно использовать настраиваемый / расширенный обработчик ошибок, который поддерживает это, а затем либо изменить его напрямую, либо заставить его читать опцию динамически. Для того, чтобы первый работал (это более простой подход, так как он не требует переопределения части кода), вам нужно будет сохранить ссылку на обработчик, к которому вы сможете получить доступ позже.
Базовый пользовательский обработчик ошибок, который поддерживает изменение параметров, может выглядеть примерно так (* обратите внимание, что это весь пример кода, не проверенный)
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();
}
// ...
а затем получить доступ и перенастроить его в вашей оболочке, как
$handler = Configure::read('Error.handler');
$handler->setOption('trace', false);
но не делайте этого на уровне файлов, как в вашем примере, делайте это в конструкторе или в main()
метод.
Других решений пока нет …