Auth::guard('user')->user() 在 Laravel 5.3 中为空

Auth::guard('user')->user() is null in Laravel 5.3

我正在尝试将当前用户对象传递给所有模板,如下所示:

class Controller extends BaseController
{
    public function __construct()
    {
        view()->share('usr', Auth::guard('user'));
    }
}

每个控制器都由控制器扩展。但是,如果我尝试转储 Auth::guard('user')->user() Laravel returns null,尽管我已登录。此外,当我将此变量传递到模板时,{{ $usr->user() }} returns 当前用户.我做错了什么?

我的config/auth.php

'defaults' => [
    'guard' => 'user',
    'passwords' => 'users',
],
'guards' => [
        'user' => [
            'driver' => 'session',
            'provider' => 'user',
        ],
    ],
'providers' => [
        'user' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],

Kernel.php

         protected $middleware = [
     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
 ];

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        //\App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

我自己的登录函数:

public function authorizes(Request $request)
{
        $this->validate($request, [
        'login' => 'required|max:50',
        'password' => 'required|max:50'
    ]);

        $credentials = $request->only(['login', 'password' ]);
        $remember = $request->get('remember', false) == 1 ? true : false;

    if ($this->guard->attempt( $credentials, $remember)) {
        $user = $this->guard->user();
        $user->last_login = date('Y-m-d H:i:s');
        $user->save();
        return redirect()->route( 'homepage' )->withSuccess(trans('app.login.success'));
    }
    return redirect()->back()->withErrors(trans('app.wrong.credentials'));
}

尝试这样做:

view()->share('usr', Auth::user());

或者这样:

view()->share('usr', auth()->user());

首先检查用户是否登录,然后将当前用户分享为:

public function __construct()
{
    if (auth()->check()) {
        $this->currentUser = auth()->user();
        View::share('currentUser', $this->currentUser);
    } else {
      // you can redirect the user to login page.
    }
}

对于你的情况,有两点需要考虑

  1. 要获得实际用户模型,您应该这样做 Auth::guard('user')->user()
  2. Auth::user()实际上在调用view()->share()时还没有初始化,见https://github.com/laravel/framework/issues/6130

因此您宁愿使用视图编辑器。在 AppServiceProviderboot 方法中添加:

\View::composer('*', function ($view) {
    $view->with('usr', \Auth::guard('user')->user());
});

在 Laravel 5.3 中,您应该像这样更改您的控制器构造函数以使其工作(假设您至少使用 Laravel 5.3.4):

public function __construct()
{
    $this->middleware(function ($request, $next) {
        view()->share('usr', Auth::guard('user'));

        return $next($request);
    });
}

您可以在 Upgrade guide 中看到此更改:

In previous versions of Laravel, you could access session variables or the authenticated user in your controller's constructor. This was never intended to be an explicit feature of the framework. In Laravel 5.3, you can't access the session or authenticated user in your controller's constructor because the middleware has not run yet.

As an alternative, you may define a Closure based middleware directly in your controller's constructor. Before using this feature, make sure that your application is running Laravel 5.3.4