grabmy/laravel-api-builder

本包最新版本(0.2.1)没有提供许可证信息。

用于Laravel的数据库和API生成器

0.2.1 2018-09-06 08:14 UTC

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/"访问,现在您可以

配置文件

配置文件包含表的定义和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路由路径
  • 更改配置中的命名空间和类继承