Laravel 5.7: пользователь не установлен при создании исключения NotFoundHttpException
Я отменяю рендеринг пары исключений в App\Exceptions\Handler
так что я могу вернуть пользовательские страницы ошибок. Тем не менее, на некоторых из исключений auth()->user()
не установлен.
в render
-метод, я просто выкидываю пользователя вот так:
public function render($request, Exception $exception)
{
dd(auth()->user());
return parent::render($request, $exception);
}
Когда исключения имеют тип NotFoundHttpException,
пользователь не установлен. Каково было бы лучшее решение для получения пользователя в этих исключениях?
2 ответа
Вот решение, но читайте дальше для другой рекомендации.
По умолчанию аутентификация Laravel выполняется через сеанс. Сессия явно начинается в web
группа промежуточного программного обеспечения.
Если маршрут не включен в web
Группа промежуточного программного обеспечения (как и несуществующий маршрут / 404), промежуточное программное обеспечение не запускается и сеанс не запускается. Поэтому Laravel не может знать, есть ли пользователь сеанса.
Лучшее решение: определить запасной маршрут, который был построен именно для этой цели.
Еще одно решение с помощью ошибок: переместить StartSession
промежуточное ПО в глобальную группу, которая запускается при каждом запросе.
/app/Http/Kernel.php:
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
// +++ MOVED SESSION START HERE BELOW +++
\Illuminate\Session\Middleware\StartSession::class,
];
Но вы должны...?
Во-первых, есть причина, по которой сеанс не загружается при каждом запросе по умолчанию: он создает дополнительные издержки, которые могут не понадобиться при каждом запросе. Например, если ваш веб-сайт настроен на постоянное использование Laravel в качестве обработчика запросов, каждые 404 будут проходить через Laravel. И их очень много - сканеры и боты постоянно ищут в Интернете известные небезопасные пути. Посмотрите на ваши журналы доступа.
Кроме того, если вы создаете автономные страницы ошибок, которые не зависят от логики внешнего приложения, вы можете повторно использовать их на уровне сервера. Если Apache или Nginx выдает ошибку, Laravel вообще не будет там, чтобы продиктовать вывод.
TL; DR: Вы можете включить сеансы на 404 и других страницах, но поймите компромиссы. Лично я рекомендую избегать логики приложения на страницах ошибок.
Пытаться:
Auth::user()
Это должно работать так же. Убедитесь, что вы включили библиотеку Auth.