使用 Laravel Orion 构建 REST API

发布于 作者:

Building REST APIs with Laravel Orion image

您是否注意到,在构建 API 时,您经常一遍又一遍地编写相同的代码?您为 [在此处输入您的实体名称] 创建一个控制器,其中包含用于列出、创建、显示、更新和删除该 [实体] 的方法。然后您创建另一个控制器,这种情况再次发生,并不断重复。然后您需要编写一些 *自定义* 方法(端点)来支持更新关系或数据透视表上的字段?听起来很熟悉,不是吗?

在过去的一年里,我一直在开发一个 Laravel 软件包,它可以完全做到这一点——抽象化这些模式,以便您能够专注于真正重要的事情——构建您的应用程序。Laravel Orion 使您能够在 *几分钟内* 构建功能齐全的 REST API,它提供用于 CRUD 操作的常用端点,处理软删除模型,并执行全面的搜索。它与 Laravel 的解决方案(如用于处理验证的请求、用于处理授权的策略和用于转换响应的资源)紧密结合。

最好的部分是什么?它适用于模型及其关系!是的,所有关系,包括最复杂的那些关系,例如 belongsToManymorphToMany 都得到了支持。这意味着,例如,您可以通过端点同步关系上的模型,而只需在控制器中编写两行代码即可。

让我们来看一些示例。

模型资源

假设您有一个名为 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::resourceapi.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::morphToManyResourceapi.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 字段。
  • 增强的批量操作。
  • 测试工具。

希望您一切安好,并度过美好的一周!

Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,永不错过新技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用人工智能、自动完成和本地和生产环境中的即时反馈进行调试。

Tinkerwell
No Compromises logo

绝不妥协

来自“绝不妥协”播客的两位经验丰富的开发人员 Joel 和 Aaron 现在可以为您的 Laravel 项目提供服务。⬧ 每月 7500 美元的固定价格。⬧ 没有漫长的销售流程。⬧ 没有合同。⬧ 100% 退款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?立即进行自动化 Laravel 升级和代码现代化,以使您的应用程序保持最新。

Shift
Bacancy logo

Bacancy

只需每月 2500 美元,即可让经验丰富的 Laravel 开发人员(拥有 4-6 年经验)为您的项目提供助力。获得 160 小时的专业知识和 15 天无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得好运 - 拥有超过十年的经验,是 Laravel 开发的理想选择!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带入 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表盘、身份验证、现成的组件、统计信息、博客、文档等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel 的合作伙伴,降低成本并加快创新,帮助公司取得成功。

Rector
MongoDB logo

MongoDB

通过将 MongoDB 和 Laravel 强力整合,增强您的 PHP 应用程序,赋予开发人员轻松高效地构建应用程序的能力。使用熟悉的 Eloquent API 支持事务、搜索、分析和移动用例。探索灵活的现代数据库 MongoDB 如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的无依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速模糊网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包在您的 Laravel 应用程序中添加评论

阅读文章