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,, пользователь не устанавливается. Что было бы лучшим решением для включения пользователя в эти исключения?

Какую версию Laravel вы используете?

Rwd 29.01.2019 22:37

Я использую Ларавель 5.7

Fredrik 29.01.2019 22:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
189
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пытаться:

Auth::user()

Это должно работать так же. Убедитесь, что вы включаете библиотеку Авторизация.

auth() — это просто вспомогательный метод, который возвращает фасад Auth. То есть это практически одно и то же.
Fredrik 29.01.2019 23:01
Ответ принят как подходящий

Вот решение, но читайте другие рекомендации.

По умолчанию аутентификация 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(), чтобы избежать ненужных накладных расходов. Как вы можете видеть здесь, кажется, он был создан именно для этого.

Fredrik 29.01.2019 23:35

Другие вопросы по теме