Краткий ответ
Насколько я знаю, перехват MissinControllerException
может быть сделан только путем настройки потока Обработка ошибок в Cakephp
Более длинный ответ
Для достижения результата вам необходимо выполнить следующее.
Если вы используете Middleware
в своем классе Application
, вам необходимо отключить промежуточное ПО для обработки ошибок, закомментировав эту строку:
->add(ErrorHandlerMiddleware::class)
Далее необходимо переписать обработчик ошибок CakePHP по умолчанию на собственный. Поэтому в src\Error
создайте файл AppError.php
с содержимым, подобным следующему:
class AppError extends ErrorHandler
{
public function _displayException($exception)
{
if($exception instanceof MissingControllerException){
$response = new Response();
$response = $response->withLocation(Router::url(
['controller'=>'Users', 'action'=>'login'])
);
$emitter = new ResponseEmitter();
$emitter->emit($response);
}else{
parent::_displayException($exception);
}
}
}
Наконец, в вашем файле bootstrap.php
необходимо зарегистрировать новый обработчик ошибок. Согласно документации нужно добавить что-то вроде этого:
$errorHandler = new \App\Error\AppError();
$errorHandler->register();
Потенциальные проблемы
Выполнение этого перенаправления скроет все ваши пропущенные исключения контроллера. Это может вызвать проблемы в случае опечаток в URL, так как вы больше не получите явную ошибку, а вместо этого будете перенаправлены на страницу входа. Файл error.log
все равно должен показывать вам исходное исключение.
Удачи!
Потенциальные проблемы 2 - CakePHP> = 3.6.x
Как указано в комментариях ndm, отключение промежуточного программного обеспечения для обработки ошибок - не всегда хорошая идея, особенно для CakePHP 3.6. В этом случае лучшим решением будет расширить промежуточное программное обеспечение ErrorHandling и зарегистрировать его.