利用 Laravel Resources 來整合第三方 API 資料
對於某些應用程式,可能需要第三方服務或者 API 來提取某些資料,將該資料轉換為所需的響應,並將其傳送到客戶端介面。
為此,我們需要找到一種方法,方便從控制器傳送到檢視或最終使用者介面的資料保持一致性。
因此,可能需要構建一個代表應用程式中所需資源的新物件或類。
您或許可能會想『為什麼我需要它?』,因為,您不希望在應用程式中公開所有的 API 響應資料,此外,你可能需要轉換該響應的某些欄位等。
在本文中,我將向您展示一種簡單的方法,將來自第三方 API 傳入的資料轉換為應用程式中的資源,以幫您保持一致性。
在進一步討論之前:在這篇文章中,我假設您至少已經基本瞭解了什麼是 API 以及該如何使用 API ,如何使用 Laravel 框架及其某些元件作為 Eloquent ORM 。 如果你不知道上面的文章大概在說明寫什麼,你可能會發現一些挑戰性的概念,但是,嘿,不要氣餒,我相信你會發現這篇文章會給你帶來一定的價值。
一些關於 "Laravel resources" 的訊息
'APIResources' 在 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 的所有資訊:Eloquent: API Resources
使用第三方 API
在使用第三方 API 時,您需要找到一種方法將傳入的響應資料轉換為結構一致的資料。
有關 Laravel 的最新訊息:不久前Eric L. Barnes 發表了一篇文章,描述了他如何使用 Laravel 為 laravel-news 網站建立一個前端頁面,然後用 WordPress作為後端並從 WordPress API 讀取資料。你可以點選這裡檢視所有文章。 https:// laravel-news.com/wordpr ess-api-with-laravel
因此,以具體案例為例。 假設您的應用程式中有一個 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」 的資訊。
總結!
因此,如果你仔細研究 「resources」 的定義。你可以將其視為中介軟體,用於將已有資料轉為新的、不同格式的物件或陣列。
更多翻譯文章請見 PHP / Laravel 開發者社群 https:// laravel-china.org/topic s/22537