
[英]Laravel: Auth::user()->id trying to get a property of a non-object
[英]trying to get property of non-object on laravel 5.4 constructor Auth::user()->id
我使用Laravel 5.4.36。 当我在构造函数方法上使用Auth::user()->id
,会显示此错误
(1/1)ErrorException
试图获取非对象的属性
在UserController.php中(第25行)
我的控制器:
public function __construct()
{
echo Auth::user()->id;
}
但是当我在索引方法上使用Auth::user()->id
,请向我显示2
public function index()
{
echo Auth::user()->id;
}
结果是:2
当我在AppServiceProvider.php引导方法上对其进行测试时,再次显示此错误
问题是会话仍未在构造函数中启动。 一旦从您的app / Http / Kernel.php注册了所有中间件,它将被注册,并且仅当用户会话启动时,您尝试获取的内容才有价值。
因此,在构造器中,您必须重写中间件功能。 在控制器文件中,您可以像这样访问用户会话数据
private $userId;
$this->middleware(function ($request, $next) {
// fetch your session here
$this->userId = Auth::user()->id;
return $next($request);
});
在该控制器的索引方法中
public function index()
{
echo $this->userId;
}
还要确保用户已登录,否则该用户的会话将不存在。
希望这会有所帮助:)
在Laravel 5.3和更高版本中,该会话在控制器构造函数中不可用,因为该框架在运行中间件之前会调用它们,因此auth服务尚未初始化。
当我们需要在控制器构造函数中使用会话或身份验证时,文档提出了以下模式:
class ProjectController extends Controller
{
protected $currentUserId;
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->currentUserId = Auth::user()->id;
return $next($request);
});
}
}
这会将中间件回调添加到中间件链的末尾,该中间件回调将在会话中间件执行后设置当前用户的值。 然后我们可以使用其他控制器方法中的$this->currentUserId
。
该对象在构造函数中不可用。 您可以使用Midelware或以其他方式使用它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.