利用 Laravel Resources 來整合第三方 API 數據

file

對於某些應用程序,可能須要第三方服務或者 API 來提取某些數據,將該數據轉換爲所需的響應,並將其傳送到客戶端界面。php

爲此,咱們須要找到一種方法,方便從控制器發送到視圖或最終用戶界面的數據保持一致性。前端

所以,可能須要構建一個表明應用程序中所需資源的新對象或類。laravel

您或許可能會想『爲何我須要它?』,由於,您不但願在應用程序中公開全部的 API 響應數據,此外,你可能須要轉換該響應的某些字段等。數據庫

在本文中,我將向您展現一種簡單的方法,未來自第三方 API 傳入的數據轉換爲應用程序中的資源,以幫您保持一致性。json

在進一步討論以前:在這篇文章中,我假設您至少已經基本瞭解了什麼是 API 以及該如何使用 API ,如何使用 Laravel 框架及其某些組件做爲 Eloquent ORM 。 若是你不知道上面的文章大概在說明寫什麼,你可能會發現一些挑戰性的概念,可是,嘿,不要氣餒,我相信你會發現這篇文章會給你帶來必定的價值。後端

一些關於 "Laravel resources" 的消息

'API Resources' 在 Laravel 5.5 中引入,做爲是「將您的模型和模型集合表達並輕鬆轉換爲 JSON 數據格式」的一種方式。api

雖然這是官方的說明,而且您發現此部分在官方網站的 Eloquent 文檔上沒有此目錄索引,但您必須知道這些資源並未嚴格附加到 Eloquent ORM 當中。數組

在最基本的意義上來講,Eloquent 容許您將給指定對象轉換爲不一樣的對象。bash

<?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 的全部信息:Eloquent: API Resources框架

使用第三方 API

在使用第三方 API 時,您須要找到一種方法將傳入的響應數據轉換爲結構一致的數據。

有關 Laravel 的最新消息:不久前 Eric L. Barnes 發表了一篇文章,描述了他如何使用 Laravel 爲 laravel-news 網站創建一個前端頁面,而後用 WordPress 做爲後端並從 WordPress API 讀取數據。你能夠點擊這裏查看全部文章。 laravel-news.com/wordpress-a…

所以,以具體案例爲例。 假設您的應用程序中有一個 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 資源中定義的同樣。

你能夠在這裏瞭解更多關於 「resource collections」 的信息。

API 資源

總結!

所以,若是你仔細研究 「resources」 的定義。你能夠將其視爲中間件,用於將已有數據轉爲新的、不一樣格式的對象或數組。

更多翻譯文章請見 PHP / Laravel 開發者社區 laravel-china.org/topics/2253…

相關文章
相關標籤/搜索