繁体   English   中英

试图在laravel 5.4构造函数上获取非对象的属性Auth :: user()-> id

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM