使用 Laravel Orion 构建 REST API
发布于 作者: Aleksei Zarubin
您是否注意到,在构建 API 时,您经常一遍又一遍地编写相同的代码?您为 [在此处输入您的实体名称] 创建一个控制器,其中包含用于列出、创建、显示、更新和删除该 [实体] 的方法。然后您创建另一个控制器,这种情况再次发生,并不断重复。然后您需要编写一些 *自定义* 方法(端点)来支持更新关系或数据透视表上的字段?听起来很熟悉,不是吗?
在过去的一年里,我一直在开发一个 Laravel 软件包,它可以完全做到这一点——抽象化这些模式,以便您能够专注于真正重要的事情——构建您的应用程序。Laravel Orion 使您能够在 *几分钟内* 构建功能齐全的 REST API,它提供用于 CRUD 操作的常用端点,处理软删除模型,并执行全面的搜索。它与 Laravel 的解决方案(如用于处理验证的请求、用于处理授权的策略和用于转换响应的资源)紧密结合。
最好的部分是什么?它适用于模型及其关系!是的,所有关系,包括最复杂的那些关系,例如 belongsToMany
和 morphToMany
都得到了支持。这意味着,例如,您可以通过端点同步关系上的模型,而只需在控制器中编写两行代码即可。
让我们来看一些示例。
模型资源
假设您有一个名为 Post
的模型,它代表一个博客文章,您希望通过 REST API 管理它。
使用 Laravel Orion,这可以通过三个简单的步骤来完成。
首先,创建一个 PostsController
并从 OrionHttpControllersController
扩展它。
<?php namespace App\Http\Controllers\Api; use App\Models\Post;use Orion\Http\Controllers\Controller; class PostsController extends Controller{ }
然后定义 $model
属性并将其设置为完全限定的模型类名称。完整的控制器应该如下所示:
<?php namespace App\Http\Controllers\Api; use Orion\Http\Controllers\Controller; class PostsController extends Controller{ /** * Fully-qualified model class name */ protected $model = Post::class; // or "AppModelsPost"}
最后,通过调用 Orion::resource
在 api.php
中注册路由。
<?php use Illuminate\Support\Facades\Route;use Orion\Facades\Orion;use App\Http\Controllers\PostsController; Route::group(['as' => 'api.'], function() { Orion::resource('posts', PostsController::class);});
完成 :tada: 现在,您可以通过 REST API 创建、列出、搜索、查看、更新和删除博客文章。尝试通过 (POST) https://<your app url>/api/posts
端点创建一个文章 :wink
您还可以通过运行 php artisan route:list
命令查看所有可用的端点。
关系资源
处理相关资源与模型资源非常类似,只有两个细微的差异。
- 关系资源控制器必须从
Orion\Http\Controllers\RelationController
扩展。 - 我们需要在控制器上定义一个额外的属性
$relation
,以告诉 Laravel Orion 它应该在模型上处理什么关系。
首先,创建一个控制器并从 Orion\Http\Controllers\RelationController
扩展它。
<?php namespace App\Http\Controllers\Api; use App\Models\Post;use Orion\Http\Controllers\RelationController; class PostCommentsController extends RelationController{}
然后定义 $model
和 $relation
属性。完整的控制器应该如下所示:
<?php namespace App\Http\Controllers\Api; use App\Models\Post;use Orion\Http\Controllers\RelationController; class PostCommentsController extends RelationController{ /** * Fully-qualified model class name */ protected $model = Post::class; // or "App\Models\Post" /** * Name of the relationship as it is defined on the Post model */ protected $relation = 'comments';}
最后,通过调用 Orion::morphToManyResource
在 api.php
中注册路由。
<?php 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 管理文章及其评论。
最终说明
策略
确保为通过 API 公开模型创建并注册了策略,或者考虑使用 DisableAuthorization
特性(仅用于本地测试),以避免在策略未注册或不正确时出现 403 错误。
与 Sanctum 或其他身份验证保护程序一起使用
默认情况下,api
保护程序用于解析当前已认证用户以进行授权。
但是,您可以通过覆盖控制器上的 resolveUser
方法来更改用户解析方式。
<br></br>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; /** * Retrieves currently authenticated user based on the guard. * * @return \Illuminate\Contracts\Auth\Authenticatable|null */ public function resolveUser() { return Auth::guard('sanctum')->user(); }}
下一步是什么?
这对我们所有人来说都是疯狂的一年,但这不应该阻止我们进行创新和向前迈进!综上所述,以下是 Laravel Orion 未来发展规划的简要概述。
- TypeScript SDK 使前端集成变得简单和标准化。
- 完全支持 JSON 字段。
- 增强的批量操作。
- 测试工具。
希望您一切安好,并度过美好的一周!