onramplab / laravel-custom-fields
一个为任何Laravel模型提供自定义字段支持的Laravel包
Requires
- php: >=8.0
- doctrine/dbal: ^3.6
- illuminate/support: ^8.0|^9.0|^10.0
- tightenco/parental: ^1.0
Requires (Dev)
- mockery/mockery: ^1.5
- nunomaduro/larastan: ^1.0
- nunomaduro/phpinsights: ^2.6
- onramplab/onr-phpcs-laravel: ^1.2
- orchestra/testbench: ^6.25
- phpmd/phpmd: ^2.13
- phpunit/phpunit: ^9.5
- rector/rector: ^0.15.3
- sempro/phpunit-pretty-print: ^1.4
- spatie/phpunit-watcher: ^1.23
- squizlabs/php_codesniffer: *
README
本包的目的是为任何Laravel模型启用自定义字段支持。
自定义字段可用于扩展模型,并提供一种更灵活的方法来合并额外的字段,而无需向数据库模型添加新属性。
要求
- PHP >= 8;
- Laravel >= 8
- composer.
功能
-
动态自定义字段:此包允许您动态地为模型定义和管理自定义字段。您可以在不修改底层数据库结构的情况下添加、更新和删除自定义字段。
-
多态关系:此包支持自定义字段与其提供上下文的模型之间的多态关系。这意味着您可以将自定义字段与不同类型的模型关联起来,根据上下文灵活地管理和检索自定义字段数据。
-
灵活的字段类型:此包支持多种字段类型,包括字符串、整数、浮点数、日期时间、选择和布尔值。您可以根据需要选择适当的字段类型。
-
验证:可以使用Laravel的验证规则验证自定义字段。您可以为每个自定义字段定义验证规则,以确保输入的值符合指定的标准。
-
默认值:您可以设置自定义字段的默认值,如果没有提供值,则将在数据输入时自动填充。
-
用户友好的命名:可以为自定义字段分配用户友好的名称,以增强应用程序中的可读性和可用性。
-
描述:您可以提供自定义字段的描述,以提供更多上下文和指导,以便用户在交互时了解这些字段。
-
轻松访问自定义字段值:使用此包,访问自定义字段值与访问常规模型属性一样简单。您可以使用熟悉的
$model->customField
语法检索自定义字段的值,使与模型属性一起处理自定义字段数据变得无缝且直观。 -
轻松集成:此包旨在无缝集成到现有的Laravel应用程序中。它遵循Laravel的约定,并利用Laravel的功能和功能,以提供顺畅的开发体验。
-
观察者支持:此包包含一个观察者,当对关联模型进行更改时,它会自动更新自定义字段值。这确保了自定义字段及其对应值之间的一致性和同步。
-
验证和错误处理:此包为自定义字段提供验证功能,允许您根据定义的规则验证用户输入。它还处理错误处理和验证消息,与Laravel的验证系统保持一致。
-
可扩展性:此包旨在具有可扩展性。您可以通过利用Laravel强大的功能(如模型事件、自定义验证规则等)轻松扩展和自定义其功能,以满足您的特定需求。
安装
通过composer安装包
composer require onramplab/laravel-custom-fields
发布迁移文件并运行命令以构建包中所需的表
php artisan vendor:publish --tag="custom-fields-migrations"
运行迁移以在数据库中创建必要的表
php artisan migrate
用法
定义自定义字段
自定义字段属性
-
friendly_name
:自定义字段的用户友好名称。 -
key
:自定义字段的唯一名称。 -
type
:自定义字段的类型。可以是以下之一:string
、integer
、float
、datetime
、select
、boolean
。 -
available_options
:类型为select
的自定义字段的可选值。 -
required
:指示自定义字段是否必需。默认值为false
。 -
default_value
:自定义字段的默认值。 -
description
:自定义字段的描述。 -
model_class
:应用自定义字段的模型的命名空间。 -
contextable_id
:此字段用于存储提供自定义字段上下文的关联模型的ID。它作为外键建立自定义字段和定义上下文的模型之间的关系。例如,如果您有一个具有自定义字段的Lead模型,并且这些字段的上下文由一个关联的Account模型提供,则contextable_id字段将存储关联Account的ID。 -
contextable_type
:此字段用于存储提供自定义字段上下文的关联模型的类名或类型。它有助于识别定义自定义字段上下文的特定模型类。继续上一个例子,contextable_type字段将存储关联Account模型的类名或类型。 -
一起,
contextable_id
和contextable_type
提供了一种在自定义字段和定义上下文的模型之间建立多态关系的方法。它们允许您将自定义字段与不同类型的模型关联起来,提供灵活性和定制性,以便根据上下文管理和检索自定义字段数据。
以下是一个关于Lead模型和Account模型代码片段及其使用的示例
- 要为Lead模型定义自定义字段,需要在Lead模型类中使用
Customizable
特质。
use OnrampLab\CustomFields\Concerns\Customizable; class Lead extends Model { use Customizable; protected $guarded = []; public function account() { return $this->belongsTo(Account::class); } public function getContext(): Model { return $this->account; } }
- 由于这些字段的上下文由关联的Account模型提供,因此需要在Account模型类中使用
Contextable
特质并重写Customizable
特质的getContext
方法。通过在Lead模型中重写getContext()
方法,我们指定Lead模型的上下文是关联的Account模型。这确保了为Lead模型定义的自定义字段与相应的Account相关联。
use OnrampLab\CustomFields\Concerns\Contextable; class Account extends Model { use Contextable; public function leads() { return $this->hasMany(Lead::class); } }
use OnrampLab\CustomFields\Concerns\Customizable; class Lead extends Model { use Customizable; protected $guarded = []; public function account() { return $this->belongsTo(Account::class); } public function getContext(): Model { return $this->account; } }
设置上述配置后,您可以按照以下步骤进行
- 使用
CustomField
模型定义自定义字段。 - 创建Lead,就像通常那样,但在自定义键下包含额外自定义字段,如上一步定义。
[ 'phone' => '12345678', 'custom' => [ 'zip' => '123' ] ]
- 如果自定义字段值通过验证,它将被存储在
CustomFieldValue
表中。 - 像访问Lead模型的其他属性一样检索自定义字段值,但使用前缀
custom
。例如,您可以使用$lead->custom_zip
访问自定义字段值。
按照这些步骤,您可以无缝地处理Lead模型的自定义字段并像访问常规属性一样访问它们的值。
运行测试
composer test
贡献
- 分叉它。
- 创建您的功能分支(git checkout -b my-new-feature)。
- 进行更改。
- 运行测试,如果需要为您的代码添加新测试(phpunit)。
- 提交更改(git commit -am '添加了一些功能')。
- 将更改推送到分支(git push origin my-new-feature)。
- 创建新的pull请求。
还请参阅CONTRIBUTION.md。
许可
请参阅许可证。