PHP Profi

Создаём REST API с помощью Laravel Orion Перевод

Building REST APIs with Laravel Orion

Вы заметили, что при создании API вы часто продолжаете писать один и тот же код снова и снова? Вы создаете контроллер для [назовите свою сущность здесь] с методами для составления списка, создания, отображения, обновления и удаления этой [сущности]. Затем вы создаете другой контроллер, и это происходит снова и снова. Затем вам нужно написать некоторые кастомные методы (endpoint'ы) только для поддержки обновления отношения или поля в сводной таблице. Звучит знакомо, не правда ли?

В прошлом году я работал над пакетом Laravel, который как раз абстрагирует эти шаблоны, чтобы вы могли сосредоточиться на том, что действительно важно – на создании вашего приложения.
Laravel Orion позволяет создавать полнофункциональные REST API за считанные минуты, предоставляя endpoint'ы с базовым функционалом для CRUD-операций. Он работает с моделями с мягким удалением, а также с расширенным поиском. Пакет тесно взаимодействует со встроенными решениями Laravel, такими как Requests для обработки валидации, Policies для обработки авторизации и Resources для преобразования ответов.

Что самое главное - это работает как для моделей, так и для их связей! Да, все отношения, включая самые сложные, такие как belongsToMany и morphToMany, поддерживаются. Это означает, что вы можете, например, обновить связи моделей (sync()) через endpoint, который становится доступным после написания всего пары строк кода в контроллере.

Давайте рассмотрим несколько примеров.

Ресурсы модели

Предположим, у вас есть Post-модель, представляющая собой пост в блоге, и вы хотите управлять им через REST API.

С помощью Laravel Orion это можно сделать в 3 простых шага:

Во-первых, создайте PostsController и унаследуйте его от OrionHttpControllersController

namespace App\Http\Controllers\Api;

use App\Models\Post;
use Orion\Http\Controllers\Controller;

class PostsController extends Controller
{

}

Затем определите свойство $model и установите для него полное имя класса модели. Готовый контроллер должен выглядеть следующим образом:

namespace App\Http\Controllers\Api;

use Orion\Http\Controllers\Controller;

class PostsController extends Controller
{
    /**
     * Полное название класса модели
     */
    protected $model = Post::class; // or "AppModelsPost"
}

Наконец, зарегистрируйте маршруты в api.php, вызвав Orion::resource

use Illuminate\Support\Facades\Route;
use Orion\Facades\Orion;
use App\Http\Controllers\PostsController;

Route::group(['as' => 'api.'], function() {
    Orion::resource('posts', PostsController::class);
});

Готово! Теперь вы можете создавать, отображать, искать, просматривать, обновлять и удалять посты в блоге с помощью REST API. Попробуйте создать пост, используя endpoint (POST) https:///api/posts.

Вы также можете просмотреть все доступные endpoint'ы, запустив команду php artisan route:list.

Связанные ресурсы

Работа со связанными ресурсами очень схожа с ресурсами моделей за исключением двух отличий:

  • Контроллер связанных ресурсов должен наследовать Orion\Http\Controllers\RelationController
  • Нам нужно определить дополнительное свойство $relation в контроллере, чтобы сказать Laravel Orion'у с каким отношением в модели он должен работать.

В первую очередь, создайте контроллер и унаследуйте его от Orion\Http\Controllers\RelationController:

namespace App\Http\Controllers\Api;

use App\Models\Post;
use Orion\Http\Controllers\RelationController;

class PostCommentsController extends RelationController
{
}

Затем определите свойства $model и $relation. Готовый контроллер должен выглядеть примерно так:

namespace App\Http\Controllers\Api;

use App\Models\Post;
use Orion\Http\Controllers\RelationController;

class PostCommentsController extends RelationController
{
    /**
     * Полное название класса модели
     */
    protected $model = Post::class; // or "App\Models\Post"

    /**
     * Название связи - как объявлено в модели Post
     */
    protected $relation = 'comments';
}

Наконец, зарегистрируйте маршруты в api.php, вызвав Orion::morphToManyResource.

use Illuminate\Support\Facades\Route;
use Orion\Facades\Orion;
use App\Http\Controllers\PostsController;
use App\Http\Controllers\PostCommentsController;

Route::group(['as' => 'api.'], function() {
    Orion::resource('posts', PostsController::class);
    Orion::morphToManyResource('posts', 'comments', PostCommentsController::class);
});

Теперь вы можете управлять постами и комментариями в них с помощью REST API.

Заключительные замечания

Политики

Убедитесь, что Policy создана и зарегистрирована для модели, которую вы достаете через API. Если политика не зарегистрирована или является неверной, попробуйте использовать трейт DisableAuthorization (только для локального тестирования) во избежание возникновения ошибки 403.

Использование с Sanctum или другими Auth guard

По умолчанию, чтобы разрезолвить текущего аутентифицированного пользователя, используется guard api.

Однако вы можете изменить способ резолва, переопределив метод resolveUser в контроллере.

namespace App\Http\Controllers\Api;

use Orion\Http\Controllers\Controller;
use App\Models\Post;

class PostsController extends Controller
{
    /**
     * @var string $model
     */
    protected $model = Post::class;

     /**
     * Получает текущего аутентифицированного пользователя
     *
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function resolveUser()
    {
        return Auth::guard('sanctum')->user();
    }
}

Что же дальше?

Этот год был безумный для всех нас, но это не должно препятствовать созданию инноваций и движению вперед! Таким образом, вот краткий обзор всего, что скоро появится в Laravel Orion:

  • SDK для Typescript для того, чтобы сделать интеграцию фронтенда простой и стандартизированной
  • Полная поддержка полей JSON
  • Улучшенные пакетные (batch) операции
  • Утилиты для тестов

Всего доброго и хорошей вам недели!

2020-12-30 оригинал

Последние посты

Комментарии

авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий