Используйте ресурсы Laravel для интеграции сторонних данных API

PHP

file

Для некоторых приложений может потребоваться сторонняя служба или 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как указано в ресурсе.

Вы можете узнать больше о «коллекциях ресурсов» здесь.

Ресурсы API

Суммировать!

Итак, если вы внимательно посмотрите на определение «ресурсы». Вы можете думать об этом как о промежуточном программном обеспечении, которое преобразует существующие данные в новый, иначе отформатированный объект или массив.

Дополнительные переведенные статьи см. в Сообществе разработчиков PHP / Laravel.Потяните Ravel-China.org/topics/2253…