无法在控制器的构造函数上调用Auth :: user()

Dan*_*iel 10 laravel laravel-5.3

我正在尝试检查用户是否拥有某个型号的权限.到目前为止(使用Laravel 5.2),我在构造函数中添加了以下代码:

public function __construct()
{
    if (!Auth::user()->hasPermission('usergroups')) {
        abort(404);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在升级到Laravel 5.3之后,从控制器的构造函数调用时Auth::user()返回null.如果我在类的任何其他方法中调用它,它将返回当前登录的用户.

任何想法为什么?

Sam*_*nch 25

看到这里:

构造函数中的会话

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

作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件.在使用此功能之前,请确保您的应用程序正在运行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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以通过在控制器操作上键入Illuminate\Http\Request类来访问请求会话数据或经过身份验证的用户:

/**
 * Show all of the projects for the current user.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return Response
 */
public function index(Request $request)
{
    $projects = $request->user()->projects;

    $value = $request->session()->get('key');

    //
}
Run Code Online (Sandbox Code Playgroud)


Huy*_*ung 5

class StudentController extends Controller
{

    public $role;

    public function __construct()
    {
        $this->middleware(function ($request, $next) {  
        if (!Auth::user()->hasPermission('usergroups')) {
            abort(404);
        }
            return $next($request);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助!!!

更新:获取您的代码

$this->middleware(function ($request, $next) {
//your code
return $next($request);
});
Run Code Online (Sandbox Code Playgroud)