• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > Laravel实现随着Resource返回自定义分页信息

Laravel实现随着Resource返回自定义分页信息

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了Laravel自定义分页,Resource返回信息,自定义分页等相关知识,希望对您有所帮助

Laravel实现随着Resource返回自定义分页信息


最近向 Laravel 框架提交了一个 想法 — 在 PaginatedResourceResponse 中添加一个自定义分页信息方法的检测,以便在使用 Resource 类输出信息时,能够非常方便地自定义分页信息。

为什么需要它

我基本上都是在开发 API。早期时候我都是直接返回,但是这种方式有时候会出现一些问题,也不方便维护,加上经常需要添加自定义字段和针对不同端给出不同数据的情况,我后来就一直在使用 Resource 来定义返回的数据。

使用 Resource 很方便也能够让逻辑清晰。但它有个不好的地方,那就是分页信息太多了。针对 API 项目而言,大多数情况下,默认输出的分页信息里很多字段并不需要,并且由于经常对接的是一些老项目,需要沿用老的数据格式或者做兼容,分页信息的字段大不相同,没办法直接使用默认返回的分页信息。

我不知道大家是怎么处理类似情况时的分页信息的,但在此之前,为了能够达到目的,我通常有两种做法,一是自定义 Response,在这里面把数据信息进行重新定义,二是将 Resource 相关的类全部自定义一遍。

我对 Laravel 底层并不是很了解,我也不擅长做抽象的框架开发,但是在经历这些之后,我发现事情能够变得简单很多,正如我在 PR 阐述的那样,如果可以在 src/Illuminate/Http/Resources/Json/PaginatedResourceResponse.php 中组建分页信息时,能够使用其对应 Resource 类的组件分页信息,那不就不需要每次大费周章的进行自定义很多类了吗。于是我就提交了这个想法给 Laravel 框架。这个提交在一开始并没有被直接接受,而是在经过 Taylor 调整后被合并,并发布在 v8.73.2。

这是我第一次向 Laravel 贡献代码,也是第一次向这么大的代码库提交合并请求,虽然没有被直接采用,但结果足以振奋人心。

使用示例

那么,我来简单的示例一下如何使用吧。

默认输出

{      "data": [],    "links": {        "first": "http://cooman.cootab-v4.test/api/favicons?page=1",        "last": "http://cooman.cootab-v4.test/api/favicons?page=1",        "prev": null,        "next": null    },    "meta": {        "current_page": 1,        "from": 1,        "last_page": 1,        "links": [            {                "url": null,                "label": "« 上一页",                "active": false            },            {                "url": "http://cooman.cootab-v4.test/api/favicons?page=1",                "label": "1",                "active": true            },            {                "url": null,                "label": "下一页 »",                "active": false            }        ],        "path": "http://cooman.cootab-v4.test/api/favicons",        "per_page": 15,        "to": 5,        "total": 5    }}

这是 Laravel 默认输出的分页信息,是不是很多字段,当然这足够应对很多场景的使用。但有时候也会因此犯难。我们需要一点灵活。


使用 ResourceCollection 类时

我们先来看看底层逻辑吧!

当在控制器返回一个 ResourceCollection 时,最终会调用其 toResponse 方法以响应。那么可以直接找到该方法看看:

/**  * Create an HTTP response that represents the object.  *  * @param  \Illuminate\Http\Request  $request  * @return \Illuminate\Http\JsonResponse  */public function toResponse($request){    if ($this->resource instanceof AbstractPaginator || $this->resource instanceof AbstractCursorPaginator) {        return $this->preparePaginatedResponse($request);    }     return parent::toResponse($request);}

看到没,如果当前资源是个分页对象时,它就把任务转向处理分页响应了。接着看:

/** * Create a paginate-aware HTTP response. * * @param  \Illuminate\Http\Request  $request * @return \Illuminate\Http\JsonResponse */protected function preparePaginatedResponse($request){    if ($this->preserveAllQueryParameters) {        $this->resource->appends($request->query());    } elseif (! is_null($this->queryParameters)) {        $this->resource->appends($this->queryParameters);    }     return (new PaginatedResourceResponse($this))->toResponse($request);}

噢,它又转给了 PaginatedResourceResponse ,这是我们最终需要修改的类,由于 toResponse 的内容太长,就不在这里贴出,反正就是在这里开始组建响应的数据,分页信息当然也是在这里面做的处理,不过它有个独立的方法。该方法就是 paginationInformation, 这是在提交 PR 前的逻辑:

/** * Add the pagination information to the response. * * @param  \Illuminate\Http\Request  $request * @return array */protected function paginationInformation($request){    $paginated = $this->resource->resource->toArray();    return [        'links' => $this->paginationLinks($paginated),&
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Laravel实现随着Resource返回自定义分页信息

相关文章

  • DEDECMS robots文件SEO优化设置的具体方法
  • PhotoShop简单的制作马赛克拼图字体效果教程
  • Photoshop设计水晶质感的立体盒子教程
  • 安装apache后如何添加代理模块
  • JavaScript 对象可以做到的几件事
  • 帝国备份王密码忘记了怎么办?
  • 网站排名内部优化方法
  • Photoshop巧用滤镜制作粉笔字教程
  • Photoshop制作石纹背景效果的立体字
  • 详解mysql double master的配置方法

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • Photoshop绘制透明效果的五角星
    • 数据库独立性是指数据库和什么相互独立?
    • Mysql如何允许外网访问设置
    • 推荐一个laravel极速完成增删改查的第三方包
    • Photoshop简单制作蓝色洁净星星文字效果
    • 怎么用php实现支付宝支付
    • 基于thinkphp6.x的API接口开发简单小实例
    • ThinkPHP如何使用migrate实现数据库迁移
    • PhotoShop打造Wacom中国风熊猫创意广告海报制作教程
    • UEditor新增自定义按钮/UEditor增加自定义插件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有