laravel php resources,利用 Laravel Resources 来整合第三方 API 数据

ed7522ba678eb569011a6909af3fb8ee.png

对于某些应用程序,可能需要第三方服务或者 API 来提取某些数据,将该数据转换为所需的响应,并将其传送到客户端界面。

为此,我们需要找到一种方法,方便从控制器发送到视图或最终用户界面的数据保持一致性。

因此,可能需要构建一个代表应用程序中所需资源的新对象或类。

您或许可能会想『为什么我需要它?』,因为,您不希望在应用程序中公开所有的 API 响应数据,此外,你可能需要转换该响应的某些字段等。

在本文中,我将向您展示一种简单的方法,将来自第三方 API 传入的数据转换为应用程序中的资源,以帮您保持一致性。

在进一步讨论之前:在这篇文章中,我假设您至少已经基本了解了什么是 API 以及该如何使用 API ,如何使用 Laravel 框架及其某些组件作为 Eloquent ORM 。 如果你不知道上面的文章大概在说明写什么,你可能会发现一些挑战性的概念,但是,嘿,不要气馁,我相信你会发现这篇文章会给你带来一定的价值。

一些关于 "Laravel resources" 的消息

'API Resources' 在 Laravel 5.5 中引入,作为是“将您的模型和模型集合表达并轻松转换为 JSON 数据格式”的一种方式。

虽然这是官方的说明,并且您发现此部分在官方网站的 Eloquent 文档上没有此目录索引,但您必须知道这些资源并未严格附加到 Eloquent ORM 当中。

在最基本的意义上来说,Eloquent 允许您将给指定对象转换为不同的对象。

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 的所有信息:Eloquent: API Resources

使用第三方 API

在使用第三方 API 时,您需要找到一种方法将传入的响应数据转换为结构一致的数据。

有关 Laravel 的最新消息:不久前 Eric L. Barnes 发表了一篇文章,描述了他如何使用 Laravel 为 laravel-news 网站建立一个前端页面,然后用 WordPress 作为后端并从 WordPress API 读取数据。你可以点击这里查看所有文章。 https://laravel-news.com/wordpress-api-wit...

因此,以具体案例为例。 假设您的应用程序中有一个 WordPress 存储库,它从 WordPress API 中提取数据。

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

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() 方法来返回转换后的对象(这将返回一个数组)。

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

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 资源中定义的一样。

你可以在这里了解更多关于 「resource collections」 的信息。

总结!

因此,如果你仔细研究 「resources」 的定义。你可以将其视为中间件,用于将已有数据转为新的、不同格式的对象或数组。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接

我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值