Для некоторых приложений может потребоваться сторонняя служба или API для извлечения некоторых данных, преобразования этих данных в желаемый ответ и доставки их в клиентский интерфейс.
Для этого нам нужно найти способ обеспечить согласованность данных, отправляемых контроллером в представление или интерфейс конечного пользователя.
Поэтому может возникнуть необходимость в создании нового объекта или класса, представляющего требуемые ресурсы в приложении.
Вы, наверное, думаете: «Зачем мне это нужно? «Потому что вы не хотите раскрывать весь API в данных ответа приложения. Кроме того, вам может потребоваться преобразовать некоторые поля ответа и так далее.
В этой статье я покажу вам простой способ преобразования входящих данных из сторонних API в ресурсы вашего приложения, чтобы помочь вам поддерживать согласованность.
Прежде чем идти дальше: в этом посте я предполагаю, что у вас есть хотя бы общее представление о том, что такое API и как его использовать, как использовать фреймворк Laravel и некоторые его компоненты в качестве Eloquent ORM. Если вы не знаете, о чем примерно говорится в приведенной выше статье, вы можете найти некоторые сложные концепции, но, эй, не расстраивайтесь, я уверен, что вы найдете эту статью полезной для вас.
Немного новостей о "ресурсах Laravel"
«Ресурсы API» были представлены в 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,
];
}
}
Вы можете узнать все о Ресурсах, прочитав официальную документацию:Eloquent: API Resources
Используйте сторонние API
При использовании сторонних API вам необходимо найти способ конвертировать входящие данные ответов в последовательно структурированные данные.
Последние новости о Laravel: не так давноEric L. BarnesОпубликовал статью, описывающую, как он использовал Laravel для создания передней страницы для новостного сайта laravel, затем использовал WordPress в качестве серверной части и считывал данные из WordPress API. Вы можете нажать здесь, чтобы просмотреть все статьи. Потяните Ravel-news.com/WordPress-ah…
Поэтому возьмем конкретный случай в качестве примера. Предположим, у вас есть репозиторий 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);
}
}
Предположим, вы получаете этот объект (данные) из API WordPress.
// 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, вот хороший пример. Первое, что вам нужно сделать, это создать новый ресурс «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
как указано в ресурсе.
Вы можете узнать больше о «коллекциях ресурсов» здесь.
Суммировать!
Итак, если вы внимательно посмотрите на определение «ресурсы». Вы можете думать об этом как о промежуточном программном обеспечении, которое преобразует существующие данные в новый, иначе отформатированный объект или массив.
Дополнительные переведенные статьи см. в Сообществе разработчиков PHP / Laravel.Потяните Ravel-China.org/topics/2253…