你有注意过吗,在建立 API 的时候总是一遍遍地写相同的代码吗?创建一个控制器,然后创建 listing , creating , showing , updating , deleting 方法。在创建另外一个控制器时,你又要创建这些方法。然后为了更新关联或者支持数据表的新字段,你再去写一些定制方法(函数)?听起来很熟悉,不是吗?
在过去的一年,我使用一个 Laravel 包准确地做好这些 – 抽象它们的模式,因此你就可以更加关注真正重要的事情 – 建立你的应用。
Laravel Orion 允许你在一分钟之内建立一个全特性 REST API 。它提供一些公共方法进行 CRUD 操作,模型的软删除,和执行综合搜索。它的分工明确,像 Laravel 中 Requests 负责验证, Policies 负责授权, Resources 负责转换响应。
最棒的部分?它可以在模型和它们的关联中使用!是的,所有关联,复杂一点的 belongsToMany
和 morphToMany
都支持。意味着,你可以在控制器中,仅写两行代码就可以完成 sync
一个模型的关联。
现在看一些例子。
模型资源
假设你有一个 Post
模型,里面保存博客文章,现在你想通过 REST API 对它进行管理。
使用 Laravel Orion 的话,简单的 3 个步骤就能完成:
首先,从 Orion\Http\Controllers\Controller
继承并创建 PostsController
。
<?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 App\Models\Post;
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);
});
完成😍 现在您可以通过 REST API 创建,列出,搜索,查看,更新,和删除博客的文章。 尝试通过 (POST) https://<你的应用程序地址>/api/posts
接口创建文章😁
你也可以通过运行 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
{
/**
* 模型的类名
*/
protected $model = Post::class; // 或者 "App\Models\Post"
/**
* 在 Post 模型中定义的关系名。
*/
protected $relation = 'comments';
}
最后,在 api.php
中调用 Orion::morphToManyResource
注册路由。
<?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
trait (仅为本地测试),避免因为没有注册策略或者策略错误而造成的 403 错误。
使用 Sanctum 或者其它 Auth 看守器
默认的情况, 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 将要做的事情:
- 整合 Typescript SDK 让前端更加方便和标准。
- 完全支持 JSON 字段
- 增强批处理
- 测试程序
祝你保持健康和有个好周末!