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