Laravel Can';在控制器上调用Auth::user();s构造函数

Laravel Can';在控制器上调用Auth::user();s构造函数,laravel,laravel-5.3,Laravel,Laravel 5.3,我试图检查用户是否有权限访问某个模型。到目前为止(使用Laravel 5.2),我在构造函数中添加了以下代码: public function __construct() { if (!Auth::user()->hasPermission('usergroups')) { abort(404); } } 现在,升级到Laravel 5.3后,Auth::user()从控制器的构造函数调用时返回null。如果我在类的任何其他方法中调用它,它将返回当前登录的

我试图检查用户是否有权限访问某个模型。到目前为止(使用Laravel 5.2),我在构造函数中添加了以下代码:

public function __construct()
{
    if (!Auth::user()->hasPermission('usergroups')) {
        abort(404);
    }
}
现在,升级到Laravel 5.3后,
Auth::user()
从控制器的构造函数调用时返回
null
。如果我在类的任何其他方法中调用它,它将返回当前登录的用户

想知道为什么吗?

参见:

构造函数中的会话

在以前版本的Laravel中,您可以访问会话变量或 控制器构造函数中经过身份验证的用户。这是 从未打算成为框架的明确特征。在拉维尔 5.3,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行

或者,您可以直接定义基于闭包的中间件 在控制器的构造函数中。在使用此功能之前,请确保 您的应用程序运行的是Laravel 5.3.4或更高版本:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class ProjectController extends Controller
{
    /**
     * All of the current user's projects.
     */
    protected $projects;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

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

因为您试图在中间件启动之前访问实例。您可以改用
request()->user()

class StudentController extends Controller
{

    public $role;

    public function __construct()
    {
        $this->middleware(function ($request, $next) {  
        if (!Auth::user()->hasPermission('usergroups')) {
            abort(404);
        }
            return $next($request);
        });
    }
}
希望能帮助你

更新: 把你的代码放进去

$this->middleware(function ($request, $next) {
//your code
return $next($request);
});

谢谢Samsquanch,你拯救了这一天!如果你得到了令人讨厌的标题错误,你可能忘记了
return$next($request)
或重定向不起作用(并且没有
返回$next($request);
)另一种选择可能是在controller中扩展Larave的callAction()方法,这将允许在执行特定操作之前使用auth()->user(),如本线程中所述:您好,欢迎使用SO!请编辑你的帖子,解释一下你做了什么,为什么它解决了这个问题,以及它与这个问题的关系。
$this->middleware(function ($request, $next) {
//your code
return $next($request);
});