Получение значений сессии в Laravel 7+ в обработчике исключений - страница 404

test

Кто делал собственную 404-ю страницу в Laravel, вероятно сталкивался с проблемой отсутствия данных из сессии когда выбивает 404 ошибку. Вы создаете свой обработчик в Exceptions\Handler.php, рендерите шаблон, а вместо авторизованного пользователя видите что пользователь разлогинен. Стоит только перейти на существующую страницу и вы видите что все в порядке.

Это происходит по всей видимости, что обработка ошибки происходит до старта сессии. И вот для этого народ много где советует вставить загрузчик сессии прям в Middleware: Http\Kernel.php:

protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        //\Illuminate\Session\Middleware\StartSession::class,
        //\Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];

Но делать это не стоит если вы пользуетесь как минимум передачей в редиректах сообщений, как например в примере ниже Http\Controllers:

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

public function exampleAction(Request $request){
            return redirect()->back()->with('error','Моя ошибка!');
}

Если кто уже столкнулся, то переменные сессии окажутся просто обнуленными. Во вьюшках вы их не получите. И вот чтобы этого не происходило, я так же нагуглил хороший вариант решения. В файле Exceptions\Handler.php добавляете подгрузку мидлвара сессии.

//подгружаем классы шифрования куки и запуска сессии
use App\Http\Middleware\EncryptCookies;
use Illuminate\Session\Middleware\StartSession;
//....
public function render($request, Throwable $exception)
    {
//обрабатываем наше исключение 404 - не найден
        if ($exception instanceof NotFoundHttpException || $exception instanceof  ModelNotFoundException) {
// а вот здесь и происходит основное действо - резолвер запускает сессию
            $sessionMiddleware = resolve(StartSession::class);
            /** @var EncryptCookies $decrypter */
            $decrypter = resolve(EncryptCookies::class);
            $decrypter->handle(request(), fn() => $sessionMiddleware->handle(request(), fn() => response('')));
//после этого рендерим наш шаблон, вы можете подставлять свою конструкцию.
            return response()->view('exceptions.404', ['page_title'=>'Ошибка 404! Страница не найдена!','is_404'=>true], 404);
        }
        return parent::render($request, $exception);
    }
//...

Вот и все. И волки сыты, и овцы целы. И на 404 сессия есть, и передача сообщений/переменных/значений между страницами нормально работает. А вот тут исходный рецепт от автора.

Категория: 
Share/Save

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!