我创建了一个名为UserResource
的新API资源:
class UserResource extends JsonResource
{
public function toArray($request)
{
/** @var User $this */
return [
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'email_verified_at' => $this->email_verified_at,
];
}
}
然后我试图获取当前的用户对象并将其传递给资源:
class UserController extends Controller
{
public function index(Request $request)
{
/** @var User $user */
$user = $request->user();
return new UserResource($user);
}
}
但是它总是抛出异常Trying to get property 'first_name' of non-object
。 $user
变量包含当前用户。
我正在使用Xdebug,并检查资源是否包含$this->resource
中的格式化json,但不包含当前用户的模型:
那为什么呢? Laravel的文档说,我可以在User
参数中获取当前资源(在我的情况下为$this->resource
模型),但是它不起作用。有什么想法吗?
答案 0 :(得分:0)
对于我来说,您从索引的请求中获得User
对象对我来说似乎很奇怪,我认为那里可能有问题。
通常,index方法用于返回所有resp实例的列表。模型,例如像
public function index() {
return UserResource::collection(User::all());
}
尝试返回您确定存在的用户对象(作为资源)
$user = Users::findOrFail(1);
return new UserResource($user);
,然后查看错误是否仍然存在。如果没有,则您在请求中传递的数据有问题。
答案 1 :(得分:0)
我看了看JsonResource类。看看构造器:
public function __construct($resource)
{
$this->resource = $resource;
}
好像$ user被保存到$ this-> resource。因此,您必须将return语句更改为:
return [
'first_name' => $this->resource->first_name,
'last_name' => $this->resource->last_name,
'email_verified_at' => $this->resource->email_verified_at,
];
行得通吗?
答案 2 :(得分:0)
正如@ClémentBaconnier在对该问题的评论中所说,解决该问题的正确方法是重新安装供应商文件夹。问题是项目是通过Laravel new
命令从本地使用php 7.2创建的,但是容器中有php 7.4。