touhidurabir/laravel-meta-fields

一个用于优雅处理特定模型附加元字段的laravel包。

1.0.1 2021-10-18 08:02 UTC

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);
}

贡献

欢迎提交拉取请求。对于重大更改,请首先创建一个问题来讨论您希望进行更改的内容。

请确保根据需要更新测试。

许可

MIT