Я переопределяю рендеринг нескольких исключений в App\Exceptions\Handler, чтобы я мог возвращать пользовательские страницы ошибок. Однако в некоторых исключениях для auth()->user() установлено значение нет.
В методе render я просто сбрасываю пользователя следующим образом:
public function render($request, Exception $exception)
{
dd(auth()->user());
return parent::render($request, $exception);
}
Когда исключения относятся к типу NotFoundHttpException,, пользователь не устанавливается. Что было бы лучшим решением для включения пользователя в эти исключения?
Я использую Ларавель 5.7






Пытаться:
Auth::user()
Это должно работать так же. Убедитесь, что вы включаете библиотеку Авторизация.
auth() — это просто вспомогательный метод, который возвращает фасад Auth. То есть это практически одно и то же.
Вот решение, но читайте другие рекомендации.
По умолчанию аутентификация 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 и других страницах, но поймите компромиссы. Лично я рекомендую избегать логики приложения на страницах ошибок.
Отличный ответ, спасибо! Вместо этого я использовал Route::fallback(), чтобы избежать ненужных накладных расходов. Как вы можете видеть здесь, кажется, он был создан именно для этого.
Какую версию Laravel вы используете?