CakePHP 3.5 перенаправить исключение отсутствующего контроллера - PullRequest
0 голосов
/ 26 апреля 2018

Я борюсь с отсутствующим исключением контроллера, выданным CakePHP. Как только неизвестный контроллер вызван, он должен перенаправить на мою страницу входа. Сначала я попытался перенаправить на свою стандартную страницу входа в систему, когда неизвестен контроллер / действие.

//default routing
$routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'InflectedRoute']);
$routes->connect('/:controller/:action/*', [], ['routeClass' => 'InflectedRoute']);
$routes->connect('/', ['controller' => 'Users', 'action' => 'login']);
//redirect if controller is not known 
$routes->connect('/*', ['controller' => 'Users', 'action' => 'login']);

Однако это не сработало вообще, поэтому я много гуглил и оказалось, что вместо перемаршрутизации нужно ловить пропущенное пропущенное значение контроллера. Я не могу узнать, где ошибка может быть поймана, и об этом очень мало написано.

Кто-нибудь уже имел к этому какое-то отношение?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы можете попытаться обработать это исключение, используя специальный Exception Renderer:

В src / Error создайте новый файл с именем, например, MyExceptionRenderer.php, и обработайте отсутствующее исключение контроллера:

namespace App\Error;

use Cake\Error\ExceptionRenderer;

class MyExceptionRenderer extends ExceptionRenderer
{
    public function missingController($error)
    {
        return $this->controller->redirect("/");
    }
}

Вам также необходимо включить этот пользовательский рендерер в config / app.php:

'Error' => [
    'errorLevel' => E_ALL,
    'exceptionRenderer' => 'App\Error\MyExceptionRenderer',
    'skipLog' => [],
    'log' => true,
    'trace' => true,
],

При этом при возникновении исключения MissingControllerException пользователь будет перенаправлен, в данном случае на главную страницу.

Более подробную информацию можно найти здесь: Обработка ошибок

0 голосов
/ 26 апреля 2018

Краткий ответ

Насколько я знаю, перехват 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 и зарегистрировать его.

...