我正在尝试检查用户是否拥有某个型号的权限。到目前为止(使用Laravel 5.2),我在构造函数中添加了这段代码:
public function __construct()
{
if (!Auth::user()->hasPermission('usergroups')) {
abort(404);
}
}
现在,升级到Laravel 5.3后,Auth::user()
在从控制器的构造函数调用时返回null
。如果我在类的任何其他方法中调用它,它将返回当前登录的用户。
任何想法为什么?
答案 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);
});