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

时间:2016-08-26 22:06:32

标签: laravel laravel-5.3

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

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

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

任何想法为什么?

3 个答案:

答案 0 :(得分:22)

请参阅here

  

构造函数中的会话

     

在早期版本的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);
        });
    }
}
     

当然,您也可以访问请求会话数据或   通过类型提示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');

    //
}

答案 1 :(得分:0)

因为您在中间件甚至触发之前尝试访问该实例。您可以改为使用request()->user()

答案 2 :(得分:0)

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