我正在处理在Laravel中制作的API中搜索结果的分页,我在文档中遇到了这个:
https://laravel.com/docs/5.3/pagination#converting-results-to-json
看起来不错,但与此同时我非常担心它会改变结果的结构这一事实,因为它会将返回的数据隐藏在“data”键中。
问题是,到目前为止,我正在返回一个非分页的JSON编码的对象数组,并且这种方式包括分页要么需要在前端进行显着的修改,要么会在API中带来不一致(会有返回嵌套数据的API调用和直接返回它们的其他API调用 - 我不喜欢它。)
我可能更希望在响应的标题中包含分页元数据,这不会弄乱我当前的响应结构。您知道任何这样的开箱即用解决方案(理想情况下是Laravel套餐)吗?或者你会建议我采取什么其他方法来解决我的困境?
答案 0 :(得分:3)
API中的分页信息似乎有两种选择 - 在Laravel的响应主体中,以及标题信息(如github does)。
我自己和Laravel一起讨论了一个新项目,而且我已经决定要在标题中进行分页 - 它只是感觉有点正确(诚然,这是一个备受争议的热门话题)。 / p>
我还没有构建这个,所以随着时间的推移可能会改变我的想法,但构建一个中间件并将其附加到API组似乎是要走的路。
在该中间件中,我们需要在添加标题之前获得完整响应,例如:
public function handle($request, Closure $next, $guard = null)
{
// let other middleware handle the request first
$response = $next($request);
// get paging links here
// <url>; rel="next", <url>; rel="prev", <url>; rel="first", <url>; rel="last"
$response->header("Link: " . $links);
return $response;
}
Laravel文档on middleware也推荐阅读。
答案 1 :(得分:1)
提示:永远坚持错误,否则你将注定要死,相信我。
通过上面的句子意味着你的前端是一个问题,而不是laravel响应,我一直在许多应用程序中使用这个分页,这些总是对我有用,意味着page_data
和page_meta_data
在一个对象中提供,因为它们属于收集。
我想向您展示两个例子
我并不是说这些是标准,但你仍然可以认为这是最好的方法。
Laravel套餐
我几乎100%确定没有laravel包供你帮忙。
Hack / Fix for your issue
Laravel让您可以自由地在回复中添加标题。
return response()->headers($key, $value)->headers($key, $value);
免责声明:这不是正确的做法,而是接近正确的方式。
答案 2 :(得分:0)
我有同样的问题。我喜欢链接标题分页,github使用它,因为响应主体只包含“原始”数据而不包含元数据。
我认为这个Laravel中间件示例可以帮助您。
Route::get('items', 'ItemController@index')->middleware('link-header-pagination');