22

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

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

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

任何想法为什么?

4

3 回答 3

51

这里

构造函数中的会话

在之前的 Laravel 版本中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户。这从未打算成为框架的明确功能。在 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);
        });
    }
}

当然,您也可以通过在控制器操作上输入 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');

    //
}
于 2016-08-26T22:14:58.753 回答
4
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);
});
于 2019-08-06T15:05:40.407 回答
0

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

于 2017-04-22T10:33:22.337 回答