Laravel 5 - 在标题而不是JSON中对结果进行分页

时间:2017-02-06 21:34:28

标签: php json laravel api pagination

我正在处理在Laravel中制作的API中搜索结果的分页,我在文档中遇到了这个:

https://laravel.com/docs/5.3/pagination#converting-results-to-json

看起来不错,但与此同时我非常担心它会改变结果的结构这一事实,因为它会将返回的数据隐藏在“data”键中。

问题是,到目前为止,我正在返回一个非分页的JSON编码的对象数组,并且这种方式包括分页要么需要在前端进行显着的修改,要么会在API中带来不一致(会有返回嵌套数据的API调用和直接返回它们的其他API调用 - 我不喜欢它。)

我可能更希望在响应的标题中包含分页元数据,这不会弄乱我当前的响应结构。您知道任何这样的开箱即用解决方案(理想情况下是Laravel套餐)吗?或者你会建议我采取什么其他方法来解决我的困境?

3 个答案:

答案 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_datapage_meta_data在一个对象中提供,因为它们属于收集。

我想向您展示两个例子

<强> Instagram的 Instagram Post Pagination

<强>的Airbnb enter image description here

我并不是说这些是标准,但你仍然可以认为这是最好的方法。

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');

https://github.com/y-zono/laravel-link-header-pagination