
Кто делал собственную 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 сессия есть, и передача сообщений/переменных/значений между страницами нормально работает. А вот тут исходный рецепт от автора.
