Laravel Can';在控制器上调用Auth::user();s构造函数
我试图检查用户是否有权限访问某个模型。到目前为止(使用Laravel 5.2),我在构造函数中添加了以下代码: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。如果我在类的任何其他方法中调用它,它将返回当前登录的
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);
});