评论收藏
class CommentsCollection extends ResourceCollection
{
public function toArray($request)
{
return [
'data' => $this->collection
];
}
}
评论控制器
public function index()
{
$post = Post::find(1);
return ['post'=> $post, 'comments' => new CommentsCollection(Comment::paginate(1))];
}
回复
"comments": {
"data": [
{
"id": 1,
"content": "First comment",
"post_id": 6,
"account_id": 1,
"created_at": "2018-03-07 02:50:33",
"updated_at": "2018-03-07 02:50:34"
}
]
}
当使用
::collection
方法的资源甚至 ResourceCollection 作为数组的一部分返回时,就会发生这种情况。
如果我们要删除数组并返回纯集合:
return new CommentsCollection(Comment::paginate(1))
一切都会顺利进行,响应将包括元和链接。
为什么 API 资源(使用
collection
方法或 ResourceCollection)在数组中返回时不包含分页信息?
我遇到了这个问题并找到了解决方案,请查看以下链接以获取解决方案的详细说明
简而言之,检查以下解决问题的代码片段
$data = SampleModel::paginate(10);
return ['key' => SampleModelResource::collection($data)->response()->getData(true)];
我注意到资源收集的结果必须单独返回才能正常工作
return ItemMiniResource::collection(
$items->paginate(10)
);
它工作得很好,但是
$data['items'] = ItemMiniResource::collection(
$items->paginate(10)
);
return $data
不包括分页链接
我已经在本地检查过它,是的,你是对的,它不会返回元和链接。所以我有一个有效的解决方案。创建帖子资源。以及您帖子的资源控制器。然后在需要评论的单个帖子 api 上,明确返回您的评论即可。
class PostsResource extends Resource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'body' => $this->body,
'comments' => Comment::paginate(5)
];
}
}
因此,您的节目控制器代码意味着单个帖子将如下所示:
public function show($id)
{
return new PostsResource(Post::find($id));
}
有多种方法可以解决您遇到的问题。这一切都取决于什么是最重要的以及响应数据需要是什么样子。至于你的问题:
为什么API资源(使用集合方法或ResourceCollection)在数组中返回时不包含分页信息?
我相信正在发生的事情是根据类的使用方式调用不同的函数来将数据获取为 JSON。当资源直接从控制器返回时,会调用其
toArray
方法。对于资源,此方法将传入的请求对象作为参数。分页器(其中之一)依赖于请求对象,因为它检查查询以查找客户端正在浏览的页面。数据采用数组形式后,会在发送到客户端之前序列化为 JSON。
当资源在数组中使用时,不保证请求对象可用。因此,我相信使用的是
toArray
方法,而不是 toJson
方法。此方法不返回任何元数据,它只是获取数据并将其转换为 JSON 字符串。
我对此进行了简要测试,差异与您描述的问题一致。