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

5
我正在尝试像这样向所有模板传递当前用户对象:

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

每个控制器都是由Controller扩展而来的。但是,如果我尝试dump Auth::guard('user')->user(),Laravel会返回null,尽管我已经登录了。此外,当我将这个变量传递到模板中时,{{ $usr->user() }}返回当前用户。我做错了什么?

我的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'));
}
4个回答

3
在Laravel 5.3中,您应该像这样更改控制器构造函数以使其工作(假设您至少使用Laravel 5.3.4):
public function __construct()
{
    $this->middleware(function ($request, $next) {
        view()->share('usr', Auth::guard('user'));

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

您可以在升级指南中了解到此变更的详细描述:
在 Laravel 的早期版本中,您可以在控制器的构造函数中访问会话变量或已认证的用户。然而,这并不是框架的显式特性,因此在 Laravel 5.3 中,您不能在控制器的构造函数中访问会话或已认证的用户,因为中间件还没有运行。
作为替代方案,您可以直接在控制器的构造函数中定义基于闭包的中间件。在使用此功能之前,请确保您的应用程序正在运行 Laravel 5.3.4 版本。

这是正确的答案,我昨天刚好遇到了! - Eric Tucker

2

尝试做这个:

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

或者这样:
view()->share('usr', auth()->user());

在这两种情况下都是 null - jdoe
你确定已经登录了吗?请再仔细检查一下。你更改了与会话相关的功能或其他内容吗?你手动将web中间件添加到你的路由中了吗? - Alexey Mezenin
在其他控制器中,该控制器返回当前用户...100%确认已经登录!Route :: group(['middleware' => 'auth'],function(){ //我的所有路由 } Route :: get('/ login',['as'=>'login','uses'=>'AuthController @ login']); Route :: get('/ logout',['as'=>'logout','uses'=>'AuthController @ logout']); Route :: post('/ login',['as'=>'authorize','uses'=>'AuthController @ authorizes']); - jdoe

0
首先检查用户是否已登录,然后将当前用户共享为:
public function __construct()
{
    if (auth()->check()) {
        $this->currentUser = auth()->user();
        View::share('currentUser', $this->currentUser);
    } else {
      // you can redirect the user to login page.
    }
}

但在控制器中它总是返回false。在其他继承自控制器的控制器中,这将返回true。 - jdoe

0

在您的情况下,有两件事需要考虑:

  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());
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接