Laravel 5.3 — Обработка исключения NotFoundHttpException

#php #exception #laravel-5.3

#php #исключение #laravel-5.3

Вопрос:

Я использую Laravel 5.3 и пытаюсь обработать все распространенные исключения appExceptionsHandler.php изнутри render() . Я хочу сохранить переменную сеанса и проверить ее в контроллере самостоятельно.

Например: для TokenMismatchException , это хорошо работает следующим образом:

 if($excp_class == 'IlluminateSessionTokenMismatchException'){
return redirect($request->fullUrl())->with('TokenError', 'CSRF');
}    
  

Однако, NotFoundHttpException похоже, я не могу получить сеанс сохранения значения.

 if(stristr($excp_class, 'NotFoundHttpException')!=false)
{
    //return redirect()->route('XYZRoute')->with('TokenError', 'NotFound'); //Also tried `withError`

    Request::session()->put('TokenError', 'NotFound'); //not working
    Request::session()->save();

    return back();
}
  

Чего мне здесь не хватает?

Комментарии:

1. Вы получаете исключение PHP? Я не думаю, что есть withError метод на RedirectResponse . Существует withErrors (множественный) метод, который ожидает результат проверки (MessageProvider), но это не то, что вы здесь делаете. Я думаю, что это просто with('TokenError', 'NotFound') то, что вы хотите.

2. With также не работает. Я перепробовал много способов поместить сеанс здесь, кстати.

3. Тогда вам нужно объяснить, что «не работает». Ваш исходный код выглядел так, как будто это вызвало бы исключение PHP. Объясните, что происходит, как вы пытаетесь получить доступ к ошибке… Подробные сведения.

4. я обновил его сейчас. Посмотрите еще раз.

Ответ №1:

Поскольку Laravel не нашел маршрут (NotFoundHttpException), ваш запрос не прошел через промежуточное программное обеспечение Illuminate Session Middleware StartSession. Тогда у вашего запроса нет сеанса.

Если вы хотите, чтобы все ваши запросы имели сеанс, вам нужно будет добавить IlluminateSessionMiddlewareStartSession::class в $middleware вашего ядра :

 namespace AppHttp;
class Kernel extends HttpKernel {
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
        IlluminateSessionMiddlewareStartSession::class,
    ];
...
}
  

Я не проверял это, но я надеюсь, что это сработает и поможет вам.

Комментарии:

1. Потрясающий человек.. это имеет смысл и также решило проблему.. Спасибо

2. Отлично. Это также решило проблему, с которой я пытался перенаправить исключение NotFoundHttpException в Handler.php с мигающим сообщением об ошибке на другую страницу.