🍁 Ellison`s Blog

  

  • 首页
  • PHP
  • 前端
  • Linux
  • Database
  • Python
  • Java
  • GoLang
  • 其他
  • 见识
  • 随言碎语
  • 登录

Laravel 5.5 之 Api Resource

  • Ellison
  • 2018-03-28 10:00
  • PHP
  • 531
  • Laravel

在 Laravel5.5 之前, 我们在处理我们的 api 接口时, 会用到 dingo 来管理我们的后台数据. 那么在 5.5 中引入了新的概念就是 api resource, 正如这个名字一样, 我们可以建立 api 资源管理.

在之前我们也有说过编写后台的 api 服务, 那么在处理数据返回字段时, 我们会选择对字段进行映射, 这样来选取我们客户端需要的 数据, 这在之前我们是通过一个 Transformer 这个中间层来进行映射.

当然再此之前我们先创建好 User 和 Post 这两个 Model, 并生成对应的数据字段.

在 5.5 中我们可以有更好的资源管理形式, 话不都说, 新建好必要的项目后, 我们去创建用户的 api 管理.

$ php artisan make:resource User

其中 make:resource 命令也是 5.5 新增的 这样我们会在 app/Http/Resources 增加了一个继承 Resource 的 User Class

在路由中, 为了演示, 我们可以在路由返回其中的一个用户:

Route::get('user', function() {
   $user = \App\User::find(2);

   return new \App\Http\Resources\User($user);
});

这样的话我们会返回 id 为 2 的这个用户的全部信息, 但这并不是我们所需要的, 那么我们可以借用 api resource 进行字段的映射.

在 \App\Http\Resources\User 里我们去返回一些基本字段.

public function toArray($request)
{
    return [
        'name'  => $this->name,
        'email' => $this->email
    ];
}

这样一来我们再去访问之前的路由返回给我们的也就是筛选之后的字段, 当然现在有个问题就是, 实际项目中我们可能需要返回其他字段

比如我们的客户端需要知道是否返回成功的信息, 那么我们可以再去重写这个
Resource 中的 with 方法

public function with($request)
{
   return [
       'code'   => 1,
       'status' => 'success'
   ];
}

这样的话我们就是增加了返回字段 code 和 status, 当然我们在返回数据 body 部分我们的是放在 data 中 我们也可以更改这个 key:

在 app/Providers/AppServiceProvider 中:

public function boot()
{
    Resource::wrap('lists');
}

这样我们的返回数据字段就是

{
    "code": 1,
    "status": "success",
    "lists": {
        "name": "Mrs. Orpha Waters MD",
        "email": "jose82@example.net"
    }
}

如果我们需要返回该用户的帖子, 这也很简单, 再增加一个 posts 字段就是了, 不够再此之前先关联一下用户和帖子的关系.

当然有一种应用场景就是我们对字段数据的判断, 就如文档中所说如果是管理员的话我们就返回特定的字段, 反之不然.

laravel 为我们提供了 when 这个 function 具体判断则是

public function toArray($request)
{
    return [
        'name'   => $this->name,
        'email'  => $this->email,
        'secret' => $this->when($this->isAdmin(), 'secret-value'),
    ];
}

这个时候只有 $this->isAdmin 返回为 true 时, 返回字段里才会出现 secret 这个 key, 不然的话在返回之前就已经过滤掉了.

ok, 在很多的场景中, 我们需要返回的是一个 collection 比如一个用户的所有帖子, 那么 api resource 同样为我们提供了对 collection 的处理方式, 在终端执行:

$ php artisan make:resource UserCollection

当然这个命名是有讲究的, 在生成的类的继承父类就可以看到出来, 那么如果我们需要制定一个 collection 的处理方式在命令中可以加一个 --collection 这个 flag, 具体可以在终端查看一下

$  php artisan make:resource -h

生成完毕之后我们会发现这个类是继承 ResourceCollection 这个父类的, 所以同样的我们可以去返回所有的用户信息.

Route::get('user', function() {
   $users = \App\User::get();

   return new \App\Http\Resources\UserCollection($users);
});

如果需要提供其他字段的也可以在 with function 增加, 当然对于处理分页, 其实在collection 的分页也提供了非常详细的字段数据.

Route::get('user',function(){
   $users = \App\User::with('posts')->paginate(3);

   return new \App\Http\Resources\UserCollection($users);
});

从返回的数据我们可以看到新增了 links 和 meta 字段里面包含了分页我们可能需要的数据, 如上一页下一页.

如果需要对用户的帖子字段进行映射, 创建一个 Post Resource 再进行一次transformer 就行.

对于关联数据的返回可以如以前所说采用 eager loader 来避免 N+1 的查询, 那么在路由方法中我们可以采用 with('posts') 这样的方式.

当然在 Resource 里我们还可以采用提供给我们的 whenLoaded 这个 function , 具体表现为:

 public function toArray($request)
{
    return [
        'name'  => $this->name,
        'email' => $this->email,
        'posts' => Post::collection($this->whenLoaded('posts'))
    ];
}

相关链接:

Eloquent: API 资源

点击分享本文:

本文为 Ellison 个人笔记,文章来自于网络或个人总结,转载无需和我联系,但请注明来自 Ellison`s Blog https://www.ruoxiaozh.com

  • 上一篇: Linux MySQL 定时备份并上传到 git 仓库
  • 下一篇: Laravel 实现文章浏览次数统计
Ellison`s Blog
请先登录后发表评论
  • 最新评论
  • 总共0条评论

加入组织

  • QQ
  • 1. 手 Q 扫左侧二维码

    2. 搜群:650017266

    3. 点击 PHP 技术开发交流

热门标签

  • Laravel (13)
  • Vue (0)
  • Git (2)
  • Nginx (9)
  • Vagrant (2)
  • Docker (0)
  • Composer (0)
  • thinkPHP (1)
  • Yii2 (0)
  • Ubuntu (0)
  • Browser (2)
  • CURL (2)
  • Pjax (1)
  • CORS (7)
  • CSS (2)
  • Editor (1)
  • Life (5)
  • Function (12)
  • PHP 7 (2)
  • MySQL (5)
  • Redis (2)
  • PostgreSQL (6)
  • Markdown (1)
  • API (4)
  • 小程序 (1)
  • JavaScript (1)
  • HTTP (3)
  • SSH (1)
  • GoLang (1)
  • VPS (1)

置顶推荐

Laravel 框架中前端如何使用 CSRF Laravel 5.6 单设备登录 Laravel 5.6 使用 UUID CURL 类封装 Laravel Eloquent 必备的实用技巧 提高安全性的最佳 Nginx 配置 Vagrant SSH 的登录总结 Laravel 跨域解决方案 CORS 跨域的概念与 TP5 的解决方案 MySQL 千万级大数据 SQL 查询优化技巧详解 数据库 30 条军规 JavaScript 判断访问客户端是 PC 端还是移动端 PHP 的笛卡尔积算法实现 API 文档编写 - APIDOC Linux MySQL 定时备份并上传到 git 仓库 Laravel 5.5 之 Api Resource Laravel 实现文章浏览次数统计 如何在 Laravel 项目中使用 Swagger 构建 Api 文档 如何编写基于 Swagger-PHP 的 API 文档 网站加载动画 Markdown 语法说明 见过世面的人,从不说这3句话 PHP7 新特性 - 完结篇 阿里云 Redis 开发规范 Nginx 负载均衡设置 PHP 生成随机红包算法 规范的 README 需要哪些内容 PHP 代码规范之 PSR-2 Ubuntu 14/16 下的 Laravel LNMP 线上环境自动部署脚本 PHP 闭包 不会,找人教你就够了? PHP 新特性 - 命名空间

最新评论

    Githubxinwei
  • Githubxinwei2018-05-29 23:51:34
  • 在用 Algolia DocSearch ...中评论
  • Ellison`s Blog666
    ruoxiao-zh
  • ruoxiao-zh2018-03-06 12:52:29
  • 在细说浏览器输入URL后发生了什么中评论
    MissJiang
  • MissJiang2018-03-05 19:24:56
  • 在细说浏览器输入URL后发生了什么中评论
  • very good !!!
    ruoxiao-zh
  • ruoxiao-zh2018-03-04 08:04:19
  • 在使用 VPS 搭建 JetBrains ...中评论
  • 这个可以有

友情链接

Laravel China 社区 Codecasts EasyWechat Laravel 学院 YiiChina WebYang.NET 刘泓宾博客 Linux 运维笔记 风雪之隅 张宴的博客 泽林博客

  • 本博客主要用于分享日常学习、生活及工作的一些心得总结, 文章源自网络, 如涉及您的利益请联系管理员删除, 联系邮箱:ruoxiaozh@163.com

    Owned By 🍁 Ellison     

  • 有时候,需要回过头思忖一会儿才能把走过的路看清楚,于是惊异于它脉络的清晰。你可以从偶然性看到必然性,又得出性格决定命运、命运影响性格的结论。只是大多数时候,我们是行者,以不同的姿态走过人生,虽然时而回头看清来时的路,却未必能看懂归途。

无需注册,用以下帐号即可直接登录

  • github登录