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

时间:2017-09-28 07:36:55

标签: php laravel laravel-5 laravel-5.4

我使用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上测试它时,启动方法再次向我显示此错误

3 个答案:

答案 0 :(得分:3)

问题是会话仍未在构造函数中启动。它将在您的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;
}

还要确保用户已登录,否则用户将无法进行会话。

希望这会有所帮助:)

答案 1 :(得分:1)

在Laravel 5.3及更高版本中,session is not available in controller constructors因为框架在运行中间件之前调用了这些,所以auth服务尚未初始化。

当我们需要在控制器构造函数中使用会话或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

答案 2 :(得分:0)

此对象在构造函数中不可用。 您可以使用Midelware或在其他方法中使用它