咨询/laravel-rule-repository

一个允许将规则(例如验证规则)附加到模型上的包。

0.3.0 2022-10-14 11:23 UTC

This package is auto-updated.

Last update: 2024-09-14 15:27:16 UTC


README

Build Status Code Coverage Scrutinizer Code Quality

一个允许将规则(例如验证规则)附加到模型上的包,同时避免在模型本身或控制器中存储它们。

安装

通过Composer安装

composer require konsulting/laravel-rule-repository

用法

每个需要验证的模型都应该为其附加一个自己的验证仓库,其中包含默认验证规则以及可选的不同状态下的验证规则。例如,在更新模型时可能需要与创建模型时不同的验证规则。

创建仓库

验证仓库必须实现Contracts\RuleRepository,因此必须包含一个返回默认规则的数组的方法default()。它还可以包含任何数量的'状态'方法,其中包含不同的规则。

注意

  • 状态方法名称应使用驼峰命名法。
  • 当检索时,状态特定的规则将与默认规则(非递归)合并。

扩展AbstractRepository

AbstractRepository类提供了一些辅助函数,使定义规则更加容易。可以扩展此类而不是直接实现接口。

有时需要将规则追加或预置到现有规则列表中,例如,仅在新创建的模型中使值成为必需。这可以通过以下方法实现

AbstractRepository::prependRule(string $rule, array $baseRules);
AbstractRepository::prependRules(array $rules, array $baseRules);

AbstractRepository::appendRule(string $rule, array $baseRules);
AbstractRepository::appendRules(array $rules, array $baseRules);

示例仓库

use Konsulting\Laravel\RuleRepository\AbstractRepository;

class UserRuleRepository extends AbstractRepository
{
    public function default() : array
    {
        return [
            'name'          => 'string',
            'email'         => 'string|email',
            'date_of_birth' => 'date',
        ];
    }
    
    public function create() : array
    {
        return $this->prependRule('required', $this->default());
    }
}

将仓库附加到模型

附加规则到的模型应使用RuleRepositoryTrait特质。建议(但不是必需)模型实现接口Contracts\HasRuleRepositories

静态属性$ruleRepositories应初始化为一个关联数组,其中包含仓库类路径,仓库名称作为键。

use Konsulting\Laravel\RuleRepository\Contracts\HasRuleRepository;
use Konsulting\Laravel\RuleRepository\RuleRepositoryTrait;

class User extends Model implements HasRuleRepository
{
    use RuleRepositoryTrait;

    protected static $ruleRepositories = [
        'validation' => UserValidationRepository::class;
    ];
}

检索验证规则

可以使用静态方法getRules($name, $state = 'default')检索模型的验证规则。

返回验证仓库的默认规则

User::getRules('validation');

// or

User::getRules('validation', 'default');

获取特定状态的规则

User::getRules('validation', 'update');

User::getRules('validation', $state);

状态名称可以使用驼峰命名法或蛇形命名法。

使用魔法方法

还可以将RepositoryMagicMethods特质添加到模型中,以允许使用更简洁的语法检索规则。可以使用以下方法检索规则

Model::{$repositoryName . 'Rules'}($state = 'default');

例如

User::validationRules();

User::validationRules('update');