weebly/laravel-mutate

修改Laravel属性

1.7.2 2024-09-23 19:45 UTC

README

License Latest Stable Version StyleCI Tests

此包允许您在PHP模型中的类型与数据库列中的类型不匹配时,将模型属性映射到数据库列。

这可以是在Eloquent模型中使用$model->ip_address作为string,但在数据库中存储为BINARY(16)以提高效率。或者始终在数据库中加密字符串,但在模型中以明文形式读取。

安装

$ composer require weebly/laravel-mutate

要使用此包,如果您不是使用自动包发现,则需要将ServiceProvider添加到config/app.php中的提供者数组中

Weebly\Mutate\LaravelMutatorServiceProvider::class

您还需要将配置发布到config/mutators.php

$ php artisan vendor:publish --provider='Weebly\Mutate\LaravelMutatorServiceProvider'

用法

在创建Eloquent模型时,您需要扩展Weebly\Mutate\Database\Model并在其中添加$mutate属性

<?php

namespace App\Models;

use Weebly\Mutate\Database\Model;

class User extends Model
{
    /**
     * {@inheritdoc}
     */
    protected $table = 'users';

    /**
     * {@inheritdoc}
     */
    protected $mutate = [
        'id' => 'uuid_v1_binary'
    ];
}

这将自动序列化/反序列化当从数据库获取/设置属性时的id属性。这允许您不再需要在模型上直接设置访问器/修改器方法。

注意:与内置的Laravel访问器/修改器不同,此包在将属性值传递给Eloquent查询构建器时会序列化属性值。

包含的修改器

  • uuid_v1_binary 将接收uuid版本1,重新排列其字节,以便如果uuidA在uuidB之前生成,则存储UuidA < 存储UuidB,并将其存储在数据库中的16字节数据中。有关字节重新排列的更多信息,请参阅:[https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/](https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/)
  • ip_binary 将接收IPv4或IPv6的字符串表示形式,并将其存储为数据库中的16字节。
  • encrypt_string 将接收未加密的字符串,并在进入数据库时对其进行加密。
  • hex_binary 将接收任何十六进制字符串属性并将其存储为二进制数据。
  • unix_timestamp 将接收Carbon日期,但以整数Unix时间戳的形式存储。

创建自定义修改器

要定义自定义修改器,您需要创建一个实现Weebly\Mutate\Mutators\MutatorContract的类,并将其添加到config/mutators.php中的enabled数组中。

注意:所有属性都会在模型实例上自动缓存,因此您不需要在修改器级别添加任何缓存逻辑。

当构建和注册修改器时,重要的是要知道它们会自动从Laravel IOC容器中解析,这意味着如果您需要自定义构造函数参数,可以为它们创建服务提供程序。

<?php

namespace App\Mutators;

use Weebly\Mutate\Mutators\MutatorContract;

class ExampleEncryptMutator implements MutatorContract
{
    /**
     * {@inheritdoc}
     */
    public function serializeAttribute($value)
    {
        return encrypt($value);
    }

    /**
     * {@inheritdoc}
     */
    public function unserializeAttribute($value)
    {
        return decrypt($value);
    }
}

测试

运行测试

$ ./vendor/bin/phpunit

许可协议

此包是开源软件,许可协议为2-Clause BSD