grabmy / laravel-api-builder
用于Laravel的数据库和API生成器
Requires
- php: >=5.3.0
- webpatser/laravel-uuid: ^3.0
This package is not auto-updated.
Last update: 2024-09-27 12:57:54 UTC
README
Laravel数据库和API生成器。
作者:Thierry DE LAPEYRE
特性
- 生成表迁移文件、控制器文件、模型文件并添加路由
- 一个Artisan命令生成所有内容并记录日志
- 获取与您的表关联的外键表记录或记录列表
- 验证字段并返回详细的错误信息
- 分离表约束并排序表创建以防止迁移错误
要求
- PHP >= 7
- Laravel >= 5.5
安装
composer require grabmy/laravel-api-builder
当您输入时,必须出现附加的Artisan命令
php artisan list
Artisan命令是"make:api",并且您必须以JSON配置文件的路径作为参数。可选的详细-v参数可以显示更多日志。
php artisan make:api ./api.json -v
快速开始
在您的Laravel项目根目录中创建配置文件"api.json"
{
"tables": {
"article": {
"fields": {
"id": "increments",
"name": "string|required|min:2",
"description": "string:200|nullable",
"published": "bool|default:0"
},
"api": {
"endpoint": "article",
"methods": ["GET", "POST", "PUT", "DELETE"]
}
}
}
}
在此示例中,我们定义了一个简单的表和API行为。将创建一个具有递增整数的表,字符串"name",长度为200的字符串"description"以及默认为false(0)的布尔型"published"。
要启动您的表迁移并创建项目中所有API文件,您必须运行一个命令。
警告:如果您已经有同名模型、控制器或迁移文件,文件将被覆盖。
php artisan make:api ./api.json
如果一切正常,您将看到生成的文件以绿色显示。您仍然需要运行创建表的迁移。
警告:基本的迁移命令也会破坏并重新创建项目中迁移的其他表
php artisan migrate fresh
假设您的项目可在"http://127.0.0.1:8000/"访问,现在您可以
-
通过以下方式获取文章表的所有内容
GET http://127.0.0.1:8000/api/article -
通过其id获取文章表的一个条目
GET http://127.0.0.1:8000/api/article/{id} -
通过JSON体中的name、description和published值创建文章
POST http://127.0.0.1:8000/api/article -
通过JSON体中的修改后的值更新文章
PUT http://127.0.0.1:8000/api/article/{id} -
删除文章
DELETE http://127.0.0.1:8000/api/article/{id}
配置文件
配置文件包含表的定义和API的行为。每个表都有其字段定义。
多表
{
"tables": {
"article": {
...
},
"category": {
...
},
"user": {
...
}
}
}
每个表的多个字段
{
"tables": {
"article": {
"fields": {
"id": "integer",
"name": "string",
"description": "string",
"content": "text"
}
}
}
}
一个字段可以有多个选项。每个选项由竖线"|"分隔。主要选项是字段的类型,通常我会把它放在第一位(这样更容易找到)。
多个选项
{
"tables": {
"product": {
"fields": {
"id": "uuid|primary",
"name": "string|required",
"description": "text|nullable",
"quantity": "integer"
}
}
}
}
一个选项可以有额外的参数。每个参数由分号";"分隔。
带多个参数的选项
{
...
"description": "string:200",
"published": "bool|default:0",
"category_id": "integer|link:category:id|nullable"
...
}
可用的请求
获取记录列表
URL: GET /api/endpoint
在我们的示例中,如果有两个文章,GET http://127.0.0.1:8000/api/article将返回
状态码: 200
主体
[
{
"id": 1,
"name": "First article",
"description": "This is my first article",
"content": "<p>...</p>"
},
{
"id": 2,
"name": "Aviation and aerospace",
"description": "AS9102 is the Aerospace Standard",
"content": "<p>...</p>"
}
]
获取一个记录
URL: GET /endpoint/{id}
在我们的示例中,GET http://127.0.0.1:8000/api/article/1 将会得到结果
状态码: 200
主体
{
"id": 1,
"name": "First article",
"description": "This is my first article",
"content": "<p>...</p>"
}
创建记录
@待办
更新记录
@待办
删除记录
@待办
错误
@待办
字段类型
UUID
如果字段具有UUID类型且是主键,则API在POST创建时将生成UUID。如果UUID字段不是主键,则在POST创建和PUT更新时,API将自动检查传递的字符串是否为有效的UUID。
增量
@待办
列表
@待办
其他选项
类型选项
如果JSON在POST创建和PUT更新时没有正确的类型,则返回错误。类型列表
- 整数
- 浮点数
- 字符串
- UUID
{
...
"name": "string|type:string",
"number": "integer|type:integer",
"valid": "boolean|type:boolean"
...
}
一对一
@待办
级联
级联选项必须放在一对一或一对多字段中。
{
"tables": {
"order": {
"fields": {
"product_id": "integer|one-to-one:product:id|cascade",
"categories": "one-to-many:category:order_id|cascade",
"image": "file|cascade",
...
}
如果从订单表中删除一个记录,则之前的API配置将
- 如果order.product_id被设置,从产品表中删除记录
- 如果分类记录与该订单记录相关联,从分类表中删除记录列表
- 如果存在,则删除文件路径图像
API配置
端点
@待办
获取
获取功能是一个强大的功能,允许您告诉API从其他表中获取记录或记录数组。
在可获取参数中
- 将字段值设置为true将获取此字段记录及其中的所有记录
- 将字段值设置为false将仅获取字段记录,但不获取其中的记录
- 没有字段或将字段设置为空对象将不会获取字段记录
可获取参数的默认值为true。
例如,使用此配置
{
"tables": {
"article": {
"fields": {
"id": "increments",
"name": "string|required|min:2",
"category_id": "integer|link:category:id|as:category",
"websites": "list:website:article_id"
},
"api": {
"endpoint": "article",
"fetchable": true
}
}
}
}
在此,我们有一个指向"category"表记录的链接和指向"website"表记录列表的链接。将"fetchable"设置为true将获取所有链接到我们的表(类型"list"或选项"link")的字段。
"as"选项与"link"选项是强制的。这意味着类别记录将放置在名为"category"的字段中,而不是"category_id"。由于"websites"字段是一个列表,因此它将获取一个记录数组,其中article_id设置为文章id的值。
现在,当我们获取一个文章记录时
{
"id": 1,
"name": "First article",
"category": {
"id": 5,
"name": "Dummy",
"tag_id": 3
},
"websites": [
{
"id": 1,
"url": "http://www.mywebsite.com/"
},
{
"id": 2,
"url": "https://www.google.com/"
}
]
}
如果我们设置可获取参数为false,我们得到的文章记录中不获取任何相关记录。
{
...
"fetchable": false
...
}
我们的文章从API变为扁平
{
"id": 1,
"name": "First article",
"category_id": 5,
}
我们看不到"websites"字段,因为它不是数据库中的保存字段,所以它只有在获取网站记录时才可用。我们现在看到"category_id"字段,它没有被过滤掉。
您还可以将可获取参数设置为仅获取文章中的"category"并获取其中的所有内容,但不获取"websites"。因此,"tag_id"的类别记录变成了一个记录,就像我们想象的是指向标签表的链接。
{
...
"fetchable": {
"category": true
}
...
}
类别被获取,其中可以获取的所有字段
{
"id": 1,
"name": "First article",
"category": {
"id": 5,
"name": "Dummy",
"tag": {
"code": "DUMMY",
"searchable": true
}
}
}
您可以设置API结果,并根据需要深入,而不会创建无限循环。请注意,您从其他表中获取的记录越多,您的API速度越慢,尤其是如果您在一个数组中获取。
获取POST和PUT选项
@待办
方法
@待办
这个API生成器不做什么
- 多字段作为主键的表
- 更改生成的文件路径(模型、控制器...)
待办
- 将数据库保存和恢复到JSON文件
- 如果api方法错误,则添加错误
- 如果"link"没有"as"选项,则添加错误
- 为电子邮件、IP、URL添加类型检查
- 添加字段类型json
完成
- 级联删除
- 添加字段类型json
- 修复更新和可填字段上的错误
- 添加“多对多”类型
- 为表格设置默认排序号
待定
- 为一对多和一对一字段添加WHERE子句
- 更改配置中的迁移、模型、控制器、API路由路径
- 更改配置中的命名空间和类继承