Квест → Как хакнуть форму
Прошли: 77
Вы заметили, что при создании 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.
По умолчанию, чтобы разрезолвить текущего аутентифицированного пользователя, используется 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:
Всего доброго и хорошей вам недели!