asseco-voice/laravel-custom-fields

Laravel自定义字段支持

v3.2.1 2024-08-29 11:15 UTC

README

自定义字段

该仓库的目的是为任何Laravel模型提供自定义字段支持。

自定义字段可以是任何你希望扩展模型的字段,提供高度灵活的模型以添加额外字段,而无需向数据库模型添加新属性。

安装

使用composer require asseco-voice/laravel-custom-fields安装此包。服务提供器将自动注册。

设置

为了使用此仓库,必须完成以下操作

  1. 需要自定义字段支持的每个模型都必须使用Customizable特质。
  2. 运行php artisan migrate迁移包表
  3. 运行php artisan db:seed --class="Asseco\CustomFields\Database\Seeders\PlainTypeSeeder"仅迁移必需数据。
  4. 你可以在你的DatabaseSeeder种子器中包含CustomFieldPackageSeeder,以在所有环境中种子必需数据或在不生产环境中种子所有其他模拟数据。

ERD

graph

自定义字段类型分解

单个自定义字段可以假设三种不同类型之一,所有这些都与自定义字段表的多态关系。

普通类型

普通类型是标准单值属性,如int、string、date等。在开始使用包之前,请确保已种入必需数据,因为这些字段直接映射到自定义字段值属性,具体取决于它们的类型。

例如,如果你说自定义字段是普通字符串值,它的值将写入自定义字段值表中的字符串列。

远程类型

如果您想从某个任意端点获取自定义字段,可以使用远程类型。远程类型具有标准URL、方法、头部和正文属性,以便您的请求可以成功执行。

使用远程类型自定义字段需要您定义您最终返回哪些普通类型,以便包知道如何将值映射到它们的属性列。

选择类型

选择类型提供了一组预定义值,您可以从中选择一个或多个。

选择类型也要求您定义您最终返回哪些普通类型,以便包知道如何将值映射到它们的属性列。

定义自定义字段

一旦种入了所有必需数据,您就可以开始定义自定义字段。您可以通过以下几种方式完成此操作

  • 通过/api/custom-fields CRUD 控制器端点,如果您希望提供定义单个自定义字段所需的所有字段
  • 通过辅助端点(其中plain_type参数是数据库中定义的普通类型之一。使用无效参数将导致404错误)
    • /api/custom-field/plain/{plain_type} - 用于创建普通类型自定义字段。
    • /api/custom-field/selection/{plain_type} - 用于创建选择类型自定义字段。
    • /api/custom-field/remote - 用于创建远程类型自定义字段。目前省略了plain_type属性并硬编码为字符串。
  • 使用Tinker在控制台

一旦定义了自定义字段,您就可以为特定模型添加针对该自定义字段的值。

即,如果您有一个联系模型,您可以为联系模型定义一个字符串普通类型自定义字段car,而不是将car属性添加到contacts表中。此时,没有任何联系被分配了值。只有在自定义字段定义之后,您才能说例如ID为5的联系有一个沃尔沃。

自定义字段属性

  • name - 自定义字段的唯一名称。
  • label - 自定义字段的用户友好名称。
  • placeholder - 提示。
  • selectable - 多态属性(_type_id),可以假设3种可用的类型之一
  • model - 自定义字段将适用的模型的命名空间。
  • required - 自定义字段是否必需。默认false
  • validation_id - 与验证字段的关系。
  • grouporder - 可空的前端友好字符串,如有必要提供分组。

普通类型属性

普通类型只有name被定义。这些映射到custom_field_values表属性,所以请确保播种必要的类型。

这是由于数据库级别的数据验证以及更快的值搜索而进行的。

例如,一个普通类型是string,查看custom_field_values迁移,您会注意到也存在一个string属性。

选择类型属性

选择类型有两个表:selection_typesselection_values

选择类型定义了plain_type_id,这是一个将选择值映射到的普通类型。不可能有混合类型的普通类型值。还有一个布尔值multiselect,应该指示前端是否可以从列表中选择单个或多个值。

值表包含所有应可供特定选择字段选择的值。选择有标准的labelvalue字段,以及preselect布尔值,该布尔值应指示前端是否应预选值(类似于选择占位符)。

远程类型属性

远程类型有标准的urlmethodbodyheaders属性来定义从该端点获取字段的端点。

您可以在/api/custom-field/remote/{remote_type}/resolve端点上解析值。

在从端点解析值时,还可以提供mappings。如果设置为null,则将按原样返回响应。否则,可以提供localKey => remoteKey格式的映射。这意味着响应将被映射到在mappings字段中提供的JSON。

例如。

Response:
{
    "remote_user": "foo"
}

Mapping: 
{
    "user": "remote_user"
}

Result:
{
    "user": "foo"
}

使用自定义字段

一旦您定义了自定义字段,您就可以开始为模型分配值。您可以通过调用/api/custom-field/values端点来这样做。请确保在请求中提供正确的值(即对于字符串字段,在有效负载中提供string属性),否则包将拒绝该值作为无效。

在存储值期间,除了值类型检查之外,您还可以向自定义字段添加正则表达式验证,该验证将在该点进行验证。

验证

您可以在/pattern/pattern格式中为自定义字段提供正则表达式验证。如果需要前端用途,您可以分配一个name,以及设置布尔选项generic,这是一个前端助手,旨在过滤出最常用的验证。您可以将这些设置为true,然后在前端下拉菜单中只返回true

关系

在自定义字段上提供一对多、多对多的父子关系。

表单

表单是我们特定 form.io 用例的辅助模型。

创建表单时,其定义将被解析,并将自动关联M:M转置表上的自定义字段。解析仅适用于 form.io 定义。

如果您想创建自己的解析器,可以发布配置文件,并用您的表单替换 Form 模型实现。扩展父模型并重写 relateCustomFieldsFromDefinition() 函数。

扩展包

发布配置将允许您更改包模型以及控制迁移的行为。如果扩展模型,请确保您在实现中扩展了原始模型。