Laravel:服务提供商中的经过身份验证的用户
Larvel5: Authenicated user in Service Provider
我创建了 ServiceProvider,并在其中放置了一些构建菜单的逻辑。此逻辑基于经过身份验证的用户。但是,Auth::user()
Auth::getUser()
不会工作,看起来会话未启动。
我把我的逻辑放在 boot
方法中。
临时解决问题,我创建middleware
并把逻辑放在那里,但我认为这是不正确的。
所以 ServiceProvider 不是这个(类似)逻辑的正确位置?或者在哪里更好地与用户一起工作?
例如:
class MenuServiceProvider extends ServiceProvider {
public function boot() {
if(Auth::user()->isAdmin()) { // here Auth::user is null
$this->createAdminMenu();
} else {
$this->createDefaultMenu();
}
}
public function register()
{
//
}
解决了这个问题,同时最近也在努力解决这个问题。正如您在评论中指出的那样,问题是加载服务提供者时会话信息甚至还没有开始——这会带来问题。解决方案是创建一个可以在 Http 内核中配置的中间件 class,它会为每个请求自动加载它。
因此,根据您上面的代码,您可能会得到类似这样的结果:
<?php
namespace App\Http\Middleware;
use Auth;
class MenuMiddleware
{
public function handle($request, \Closure $next)
{
if(Auth::user()->isAdmin()) { // here Auth::user is null
$this->createAdminMenu();
} else {
$this->createDefaultMenu();
}
return $next($request);
}
...
}
然后,在您的 RouteServiceProvider 中 - 只需在全局中间件数组中注册中间件。
我创建了 ServiceProvider,并在其中放置了一些构建菜单的逻辑。此逻辑基于经过身份验证的用户。但是,Auth::user()
Auth::getUser()
不会工作,看起来会话未启动。
我把我的逻辑放在 boot
方法中。
临时解决问题,我创建middleware
并把逻辑放在那里,但我认为这是不正确的。
所以 ServiceProvider 不是这个(类似)逻辑的正确位置?或者在哪里更好地与用户一起工作?
例如:
class MenuServiceProvider extends ServiceProvider {
public function boot() {
if(Auth::user()->isAdmin()) { // here Auth::user is null
$this->createAdminMenu();
} else {
$this->createDefaultMenu();
}
}
public function register()
{
//
}
解决了这个问题,同时最近也在努力解决这个问题。正如您在评论中指出的那样,问题是加载服务提供者时会话信息甚至还没有开始——这会带来问题。解决方案是创建一个可以在 Http 内核中配置的中间件 class,它会为每个请求自动加载它。
因此,根据您上面的代码,您可能会得到类似这样的结果:
<?php
namespace App\Http\Middleware;
use Auth;
class MenuMiddleware
{
public function handle($request, \Closure $next)
{
if(Auth::user()->isAdmin()) { // here Auth::user is null
$this->createAdminMenu();
} else {
$this->createDefaultMenu();
}
return $next($request);
}
...
}
然后,在您的 RouteServiceProvider 中 - 只需在全局中间件数组中注册中间件。