对于某些应用程序,可能需要第三方服务或者 API 来提取某些数据,将该数据转换为所需的响应,并将其传送到客户端界面。
为此,我们需要找到一种方法,方便从控制器发送到视图或最终用户界面的数据保持一致性。
因此,可能需要构建一个代表应用程序中所需资源的新对象或类。
您或许可能会想『为什么我需要它?』,因为,您不希望在应用程序中公开所有的 API 响应数据,此外,你可能需要转换该响应的某些字段等。
在本文中,我将向您展示一种简单的方法,将来自第三方 API 传入的数据转换为应用程序中的资源,以帮您保持一致性。
在进一步讨论之前:在这篇文章中,我假设您至少已经基本了解了什么是 API 以及该如何使用 API ,如何使用 laravel 框架及其某些组件作为 Eloquent ORM 。 如果你不知道上面的文章大概在说明写什么,你可能会发现一些挑战性的概念,但是,嘿,不要气馁,我相信你会发现这篇文章会给你带来一定的价值。
一些关于 "laravel resources" 的消息
'API Resources' 在 Laravel 5.5 中引入,作为是 “将您的模型和模型集合表达并轻松转换为 JSON 数据格式” 的一种方式。
虽然这是官方的说明,并且您发现此部分在官方网站的 Eloquent 文档上没有此目录索引,但您必须知道这些资源并未严格附加到 Eloquent ORM 当中。
在最基本的意义上来说,Eloquent 允许您将给指定对象转换为不同的对象。
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\Resource; class UserResource extends Resource { /** * 将资源转换为数组。 * * @param \Illuminate\Http\Request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } }
您可以通过阅读官方文档了解有关 Resources 的所有信息
使用第三方 API
在使用第三方 API 时,您需要找到一种方法将传入的响应数据转换为结构一致的数据。
因此,以具体案例为例。 假设您的应用程序中有一个 WordPress 存储库,它从 WordPress API 中提取数据。
<?php class WordpressRepository { pubic function getPost($id) { $response = $this->apiClient->get( 'post', $query = ['id' => $id] ); // return as array return json_decode($response, true); } }
假设您从 WordPress API 接收此对象 (数据)
// wordpress version 0.1 { ID: 123 post_title: "some title" post_content: "some content", post_author: "joe", publish_date: "01-01-2001" }
您可以将此响应包装到一个数组中,然后在所有控制器或视图上使用此数据。
响应格式一致性
不妨想一想,如果 WordPress 的 API 更新了怎么办。假如新版本会返回一个不同格式的数据。
// wordpress version 0.1 { post_id: 123 title: "some title" content: "some content", author: "joe", date: "01-01-2001" }
那么你就需要在项目的多个位置把 $post['post_title'] 替换成 $post['title'] 。
使用中间件来处理响应数据可以确保数据库的一致性。当响应的格式增加时,你只需要更新某段代码即可。
使用 API 资源批量处理数据
正如我之前提到的,你可以使用没有 Eloquent 的 「Resources」,下面就是一个很好的例子。
您需要做的第一件事是创建一个新的「Post」资源;使用 artisan:
$ php artisan make:resource Post
<?php namespace App\Resources; use Illuminate\Http\Resources\Json\Resource; class Post extends Resource { public function toArray($request) { return [ 'title' => $this->resource['title'], 'content' => $this->resource['content'], 'slug' => $this->resource['slug'] ]; } }
返回单个资源实例
现在可以参照相同的例子,在你的 API 容器类中,你可以创建一个此资源新的实例,然后使用 resolve () 方法来返回转换后的对象(这将返回一个数组)。
<?php class WordpressRepository { pubic function getPost($id) { $response = $this->apiClient->get( 'post', $query = ['id' => $id] ); $data = json_decode($response, true); return Post::make($data)->resolve(); } }
返回数据集合
我们可以创建一个专用的资源类 「PostCollection」。
$ php artisan make:resource PostCollection
<?php namespace App\PublisherPlus\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class PostCollection extends ResourceCollection { public function toArray($request) { return [ 'data' => $this->collection ->map ->toArray($request) ->all(), 'links' => [ 'self' => 'link-value', ], ]; } }
在上面的例子中,data 将会包含一个 Posts 数组,该数组的结构跟你在 Post 资源中定义的一样。
总结!
因此,如果你仔细研究 「resources」 的定义。你可以将其视为中间件,用于将已有数据转为新的、不同格式的对象或数组。想要获取更多laravel教程欢迎关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/8303/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取