awobaz/eloquent-mutators

为 Laravel 5 的 Eloquent 提供可重用的访问器和修改器(获取器/设置器)

1.0.22 2024-08-03 17:22 UTC

README

Eloquent 修改器 允许我们在 Eloquent 模型外部定义访问器和修改器。这使我们能够在任何模型或同一模型的任何属性上组织并重用它们。

问题

Eloquent 支持 访问器和修改器。然而,它要求我们直接在模型中定义它们。如果我们想在其他模型中重用访问器/修改器逻辑呢?或者,如果我们想重用同一模型其他属性的访问器/修改器逻辑呢?我们做不到!Eloquent 修改器 旨在解决这个限制。

相关讨论

安装

安装 Eloquent 修改器 的推荐方式是通过 Composer

$ composer require awobaz/eloquent-mutators

如果你使用 Laravel 5.5+,该包将自动注册自己。对于 Laravel 5.4,你必须手动注册该包

  1. 打开你的 config/app.php 文件,并将以下内容添加到 providers 数组中
Awobaz\Mutator\MutatorServiceProvider::class,
  1. 在相同的 config/app.php 文件中,将以下内容添加到 aliases 数组中
'Mutator'   => Awobaz\Mutator\Facades\Mutator::class,

注意: Eloquent 修改器 需要 Laravel 5.4+。

安装后,使用 mutators:install Artisan 命令发布资产。主要配置文件位于 config/mutators.php。安装还会发布和注册 app/Providers/MutatorServiceProvider.php。在此服务提供程序中,您可以注册自定义访问器/修改器扩展。

php artisan mutators:install

使用

使用 Awobaz\Mutator\Database\Eloquent\Model

只需使您的模型类继承自 Awobaz\Mutator\Database\Eloquent\Model 基类即可。Awobaz\Mutator\Database\Eloquent\Model 扩展了 Eloquent 基类,而不会更改其核心功能。

使用 Awobaz\Mutator\Mutable 特性

如果您无法从 Awobaz\Mutator\Database\Eloquent\Model 继承模型,您可以利用 Awobaz\Mutator\Mutable 特性。只需在您的模型中使用此特性即可。

语法

配置您的模型后,您可以为其属性配置访问器和修改器。

定义访问器

对于以下 Post 模型,我们为 titlecontent 属性配置了去除前后空白的访问器

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use \Awobaz\Mutator\Mutable;
    
    protected $accessors = [
        'title'   => 'trim_whitespace',
        'content' => 'trim_whitespace',
    ];
}

如您所见,我们在模型上使用了一个名为 accessors 的数组属性来配置其 访问器。数组的每个键代表一个属性的名称,值指向一个或多个访问器。要应用多个访问器,请传递一个数组作为值(访问器将按指定顺序应用)

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use \Awobaz\Mutator\Mutable;
    
    protected $accessors = [
        'title'   => ['trim_whitespace', 'capitalize'], 
        'content' => ['trim_whitespace', 'remove_extra_whitespace'],
    ];
}

定义修改器

要定义修改器,请使用名为 mutators 的数组属性。

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use \Awobaz\Mutator\Mutable;
    
    protected $mutators = [
        'title'    => 'remove_extra_whitespace',
    ];
}

注意: 用于访问器和修改器的属性名称可以在 config/mutators.php 配置文件中分别配置。

定义访问器/修改器扩展

在前面的示例中,我们使用了该包提供的访问器/修改器。您还可以使用Mutator门面中的extend方法注册访问器/修改器扩展。extend方法接受访问器/修改器的名称和一个闭包。

<?php

namespace App\Providers;

use Awobaz\Mutator\Facades\Mutator;
use Illuminate\Support\ServiceProvider;

class MutatorServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //Register your custom accessors/mutators extensions here.
        Mutator::extend('extension_name', function($model, $value, $key){
            //DO STUFF HERE AND RETURN THE VALUE
        });
    }
}

如您所见,模型($model)、属性值($value)和属性名称($key)被传递到闭包中,这使得您能够访问模型的其它属性来计算并返回所需的值。

额外参数

您还可以为扩展定义额外的参数。这为我们实现了动态访问器/修改器的灵活性。

<?php

namespace App\Providers;

use Awobaz\Mutator\Facades\Mutator;
use Illuminate\Support\ServiceProvider;

class MutatorServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //The following extension is an implementation for str_replace
        Mutator::extend('str_replace', function ($model, $value, $key, $search, $replace) {
            return str_replace($search, $replace, $value);
        });
    }
}

在上面的示例中,模型($model)、属性值($value)、属性名称($key)和两个额外的参数被传递到闭包中。

应用此扩展,我们可以使用以下语法

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use \Awobaz\Mutator\Mutable;
    
    protected $accessors = [
        'content' => ['str_replace' => ['one', 'two']]
        //OR 
        //'content' => 'str_replace:one,two'
    ];
}

这将把content属性的每个one替换为two

内置访问器/修改器

小写

将属性转换为小写。

大写

将属性转换为大写。

首字母大写

将属性的首个字符转换为大写。

单词首字母大写

将属性中每个单词的首个字符转换为大写。

去除空白字符

去除属性的首尾空白字符。

驼峰式

将属性转换为驼峰式。

蛇形

将属性转换为蛇形。

大驼峰式

将属性转换为大驼峰式。

短横线式

将属性转换为短横线式。

标题式

将属性转换为标题式。

复数

将属性转换为复数形式(仅支持英语)。

单数

将属性转换为单数形式(仅支持英语)。

URL化

将属性转换为URL友好的“slug”形式。

去除额外空白字符

去除属性中的额外空白字符。

preg_replace:pattern,replacement[,limit]

在属性上执行正则表达式搜索和替换。

版本管理

我们使用SemVer进行版本管理。有关可用的版本,请参阅此存储库上的标签

单元测试

为了运行测试套件,安装开发依赖项

$ composer install --dev

然后,运行以下命令

$ vendor/bin/phpunit

作者

贡献

请阅读CONTRIBUTING.md,了解我们的行为准则以及提交拉取请求的流程。

赞助商

  • Awobaz - 加拿大蒙特利尔的Web/移动代理机构

许可

Eloquent Mutators采用MIT许可