Laravel资源toArray()无法正常工作

时间:2020-10-10 08:49:38

标签: php laravel

我创建了一个名为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,但不包含当前用户的模型: enter image description here

那为什么呢? Laravel的文档说,我可以在User参数中获取当前资源(在我的情况下为$this->resource模型),但是它不起作用。有什么想法吗?

更新:这是UserResource中xbedug的断点: enter image description here

3 个答案:

答案 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。