Laravel 5.7:抛出 NotFoundHttpException 时未设置用户

Laravel 5.7: User Not Set When Throwing NotFoundHttpException

我正在覆盖 App\Exceptions\Handler 中几个异常的呈现,因此我可以 return 自定义错误页面。但是,在某些例外情况下,auth()->user() 而不是 集。

render-方法中,我只是像这样转储用户:

public function render($request, Exception $exception)
{
    dd(auth()->user());

    return parent::render($request, $exception);
}

当异常属于 NotFoundHttpException, 类型时,用户未设置。让用户陷入这些异常的最佳解决方案是什么?

尝试:

Auth::user()

它应该以同样的方式工作。确保您包含 Auth 库。

这是解决方案,但请继续阅读以获得不同的建议。

默认情况下,Laravel 的身份验证 运行 通过会话进行。会话在 web middleware group.

中明确启动

如果路由未包装在 web 中间件组中(作为不存在的/404 路由),中间件不会 运行,会话也不会开始了。因此Laravel无法知道是否有session用户

最佳解决方案: 定义一个 fallback route 正是为此目的而构建的。

另一种解决方案,有陷阱: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 作为请求处理程序,则 every 404 将通过 Laravel 进行路由。还有很多 - 爬虫和机器人不断在网络上搜索已知的不安全网络路径。查看您的访问日志。

此外,如果您创建不依赖于外部应用程序逻辑的独立错误页面,则可以在服务器级别重用它们。如果 Apache 或 Nginx 抛出错误,Laravel 根本不会在那里指示输出。

TL;DR:您可以在 404 和其他页面上启用会话,但要了解权衡取舍。就个人而言,我建议避免错误页面上的应用程序逻辑。