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 和其他页面上启用会话,但要了解权衡取舍。就个人而言,我建议避免错误页面上的应用程序逻辑。
我正在覆盖 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 和其他页面上启用会话,但要了解权衡取舍。就个人而言,我建议避免错误页面上的应用程序逻辑。