gabrieljmj / laravel-rule-sets

通过请求避免重复规则集。

v1.2.0 2021-01-13 17:50 UTC

This package is auto-updated.

Last update: 2024-09-14 02:30:21 UTC


README

Travis (.com) Packagist

避免重复验证规则集。使用此库可以在集合之间共享规则,并通过请求重用集合。

安装

Composer

执行以下命令

composer require gabrieljmj/laravel-rule-sets

对于Laravel 5.5之前的版本

需要在config/app.php的提供者列表中添加服务提供者

Gabrieljmj\LaravelRuleSets\Providers\RuleSetsServiceProvider::class,

使用方法

该包提供了 artisan 命令make:rule-set。它将在命名空间App\Rules\RuleSets下生成一个 RuleSet。

artisan make:rule-set UserRuleSet

在集合的受保护方法rules中添加必要的规则。

<?php

namespace App\Rules\RuleSets;

use Gabrieljmj\LaravelRuleSets\AbstractRuleSet;

class UserRuleSet extends AbstractRuleSet
{
    protected function rules(): array
    {
        return [
            'username' => 'required',
            'email' => 'required|email',
            'password' => 'required|min:8|confirmed',
        ];
    }
}

然后您现在可以将它注入到请求的rules方法中。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\RuleSets\UserRuleSet;

class UserRequest extends FormRequest
{
    // ...

    public function rules(UserRuleSet $userRules)
    {
        return $userRules->getRules();
    }
}

组合规则集

combineWithRules(array $rules)

此方法将用于将规则注入到规则集对象中。

注意:同名规则将被新规则覆盖。

use App\Rules\RuleSets\UserRuleSet;
use App\Rules\RuleSets\PasswordRuleSet;

// ...

public function rules(UserRuleSet $userRules, PasswordRuleSet $passwordRuleSet)
{
    return $userRules
        ->combineWith([$passwordRuleSet])
        ->getRules();
}

$combineWith

一个数组,其中包含将在getRules执行期间注入到规则集合中的集合。

<?php

namespace App\Rules\RuleSets;

use Gabrieljmj\LaravelRuleSets\AbstractRuleSet;

class PersonRuleSet extends AbstractRuleSet
{
    protected function rules(): array
    {
        return [
            'name' => 'required',
        ];
    }
}
<?php

namespace App\Rules\RuleSets;

use Gabrieljmj\LaravelRuleSets\AbstractRuleSet;

class UserRuleSet extends AbstractRuleSet
{
    public function __construct(PersonRuleSet $personRuleSet)
    {
        // Adds other rule set
        $this->combineWith[] = $personRuleSet;
    }

    protected function rules(): array
    {
        return [
            'email' => 'required|email',
            'password' => 'required|min:8|confirmed',
        ];
    }
}
$userRuleSet->getRules(); // ['email' => '...', 'password' => '...', 'name' => '...']
覆盖规则

有时两个集合将为输入提供一个规则。首选的将是组合的集合中的规则。如果需要,只需将集合的受保护属性$overrideRules设置为true即可覆盖规则。

<?php

namespace App\Rules\RuleSets;

use Gabrieljmj\LaravelRuleSets\AbstractRuleSet;

class UserRuleSet extends AbstractRuleSet
{
    protected $overrideRules = true;

    public function __construct(PersonRuleSet $personRuleSet)
    {
        $this->combineWith[] = $personRuleSet;
    }

    protected function rules(): array
    {
        return [
            'email' => 'required|email',
            'password' => 'required|min:8|confirmed',
            'name' => 'required|length:25',
        ];
    }
}