weebly / laravel-mutate
修改Laravel属性
Requires
- php: >=7.2 || ^8.0
- laravel/framework: >=5.0
- ramsey/uuid: ~3.0 || ~4.0
Requires (Dev)
- laravel/framework: >=5.0
- mockery/mockery: ^1.0
- orchestra/testbench: ^6.0
- phpstan/phpstan: ^1.8
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-23 19:46:32 UTC
README
此包允许您在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。