touhidurabir / laravel-meta-fields
一个用于优雅处理特定模型附加元字段的laravel包。
Requires
- illuminate/contracts: ^8.61
- illuminate/database: ^8.61
- illuminate/events: ^8.61
- illuminate/support: ^8.61
- touhidurabir/laravel-model-uuid: ^1.0
Requires (Dev)
- orchestra/testbench: ^6.21
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-18 14:06:27 UTC
README
一个用于laravel框架以优雅方式处理模型元数据的php包。
安装
使用composer安装此包
composer require touhidurabir/laravel-meta-fields
发布配置和迁移文件
php artisan vendor:publish --provider="Touhidurabir\MetaFields\MetaFieldsServiceProvider"
配置
meta-field 配置文件包含元表名称和元模型的配置选项。它还提供了一个转换选项,该选项将被应用于包含元字段的元表的 metas 列,这些字段可以是 数组、对象 或 集合(Laravel Collection) 。阅读配置文件以获取更多详细信息。
使用方法
要使用模型,只需使用 HasMeta trait。
<?php namespace App\Models; use Touhidurabir\MetaFields\HasMeta; class User extends Authenticatable { use HasMeta; }
然后可以这样使用它
$user = User::create([...]); $meta = $user->storeMeta([]);
由于此包使用 Illuminate\Database\Eloquent\Relations\MorphMany 来维护父模型和元字段之间的一对多多态关系,因此可以通过重写 HasMeta trait 的 canHaveMultipleMetas 方法并返回 false 来限制模型是否可以有多个元字段。
/** * Define if a model can have multiple meta data records * * @return bool */ public function canHaveMultipleMetas() { return false; }
元字段是有状态的,即如果关联的父模型被删除、强制删除或恢复,元记录将遵循相同的模型记录状态。这默认是启用的。要禁用此功能,直接在模型类中重写 syncWithParent 并返回 false。
/** * Define if the metas associated with a parent model sync with parents state * The sync up behaviour apply to parent's [delete, force delete and restore] events * * @return bool */ public function syncWithParent() { return true; }
由于元字段作为 Polymorphic Relations 管理,并使用laravel的MorphMany关系,因此所有相关模型的功能都是可用的。但此包还提供了一些附加方法。
要更新,可以使用 updateMeta 方法,例如
$user->updateMeta([])
注意:如果模型可以有多个元记录,调用 updateMeta 将引发异常,因为无法确定要更新哪个元记录。
要删除,可以使用 deleteMeta 方法,例如
$user->deleteMeta()
默认情况下,元记录将作为软删除记录被删除,因为此包在元模型上使用了 softDeletes trait。要强制删除,将 true 作为唯一参数传递给 deleteMeta 方法。
此包提供了一些方便的内置方法来处理模型实例的元数据。例如
要确定模型实例是否有任何关联的元数据
$user->hasMeta()
这将根据是否有任何关联的元数据返回 布尔值。
要确定是否有特定的元字段关联
要确定模型实例是否与特定的元字段关联,请按照以下方式操作
$user->isMetaAssociated('field_name')
默认情况下,它将返回一个 布尔值 来指示是否与此关联有任何关联的元字段。但如果需要这些记录,也可以通过将 true 作为第二个参数传递来返回匹配的元数据集合或空的集合(如果没有找到)。
要获取元值
要获取模型实例给定字段的元值,请按照以下方式操作
$user->metaValue('field_name')
默认情况下,它将仅传递一个单值和第一个匹配值,即使有多个包含给定元字段的元记录也是如此。要获取所有值,请将 true 作为第二个参数传递,它将返回一个包含所有值的数组。
存储元数据和验证
为了使元数据的存储和验证过程更简单,此包提供了一个名为 WithMetaFields 的特性,该特性可以与 FormRequest 类一起使用。该特性包含一个抽象方法 metaRules,必须对其进行定义,该方法将包含元数据的验证规则。此包还将使用此方法中定义的字段名称来确定元数据字段。
在 FormRequest 类中使用该特性如下
use Illuminate\Foundation\Http\FormRequest; use Touhidurabir\MetaFields\WithMetaFields; class StoreUser extends FormRequest { use WithMetaFields; /** * The meta fields validation rules * * @return array */ public function metaRules() : array { return [ 'bio' => [ ... ], 'dob' => [ ... ], ]; } }
然后在 控制器 类中,
/** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(StoreUser $request) { // create user $user = User::create(...); // store meta for user $metas = $request->metas($request->validated()); // this array[$request->validated()] argument is optional $user->storeMeta($metas); }
贡献
欢迎提交拉取请求。对于重大更改,请首先创建一个问题来讨论您希望进行更改的内容。
请确保根据需要更新测试。