henzeb/ruler-laravel

使用自己的 Rule 接口扩展 Laravel 的验证器

v1.4.0 2024-03-11 10:55 UTC

This package is auto-updated.

Last update: 2024-09-11 11:55:39 UTC


README

Build Status Latest Version on Packagist Total Downloads Test Coverage

这个库允许您将您的 Rule 作为字符串使用,就像使用现有的验证器如 requiredrequired_ifunique 一样。

例如:Laravel 已经内置了一个用于枚举的规则。由于您传递的是字符串参数,您应该能够这样使用它

 [
   'attribute'=>'required|enum:App\Enums\YourEnum'
 ]

对吗?

错误!

为了这样使用它,您需要扩展您的验证器并使用 Illuminate\Validation\Rules\Enum 规则,或者创建自己的版本。这个库简化了这一过程。

我已经为您注册了 enum,但您也可以轻松地添加自己的规则。

安装

您可以通过 composer 安装此包

composer require henzeb/ruler-laravel

注意:由于枚举,我仅支持 PHP ^8.1。

用法

只需将 Henzeb\Ruler\Concerns\Ruler 特性添加到您的服务提供器中,并将您的规则添加到 $rules 属性中。

use Henzeb\Ruler\Concerns\Ruler;
use Illuminate\Support\ServiceProvider;
use App\Rules\YourRule;
use App\Rules\YourOtherRule;

class YourProvider extends ServiceProvider
{
    use Ruler;
    
    private array $rules = [
        'your_rule' => YourRule::class,
        YourOtherRule::class
    ]; 
}

您可以选择指定一个名称,或者让 Ruler 为您创建一个名称。

例如:YourOtherRule 将得到名称 your_other_rule

如果您的提供器需要实现 boot 方法,只需在那个 boot 方法内部调用 bootRuler 方法。

use Henzeb\Ruler\Concerns\Ruler;
use Illuminate\Support\ServiceProvider;
use App\Rules\YourRule;
use App\Rules\YourOtherRule;

class YourProvider extends ServiceProvider
{
    use Ruler;
    
    private array $rules = [
        'your_rule' => YourRule::class,
        YourOtherRule::class
    ]; 
    
    public function boot() {
        $this->bootRuler();
        // your code
    }
}

如果您需要条件性地执行此操作,也可以自己执行。

use Henzeb\Ruler\Concerns\Ruler;
use Illuminate\Support\ServiceProvider;
use App\Rules\YourRule;
use App\Rules\YourOtherRule;

class YourProvider extends ServiceProvider
{
    use Ruler;
    
    public function boot() {
        if(/** some condition */) {
            $this->rule(YourRule::class, 'your_rule');
        }
        
        if(/** some condition */) {
            $this->rule(YourOtherRule::class);
        }
        // your code
    }
}

规则类

规则的实现就像您通常定义的任何其他 Rule 一样。因此,您将熟悉实现方式。

use Illuminate\Contracts\Validation\Rule;

class YourRule implements Rule {

    public function passes($attribute, $value)
    {
        // your validation code
    }
    
    public function message() 
    {
        return 'Message when fails';
    }
}

注意:您也可以在这里使用可调用的规则。

参数

您可以使用参数。只需添加一个构造函数,并按您希望使用的顺序添加参数。支持可选参数。

注意:目前,您将收到它们作为字符串,不会进行其他标量类型的转换。

public function __construct(private string $param1, private string $param2 = null){}

隐式规则

要添加隐式规则,您只需实现 Illuminate\Contracts\Validation\ImplicitRule 接口。Ruler 会为您完成剩余的工作。

use Illuminate\Contracts\Validation\ImplicitRule;

class YourImplicitRule implements ImplicitRule {
    // the code
}

依赖规则

要添加依赖规则,只需实现 Illuminate\Contracts\Validation\DataAwareRule 接口。Ruler 会为您完成剩余的工作。

use Illuminate\Contracts\Validation\DataAwareRule;

class DependentRule implements DataAwareRule {
    private array $data;
    
    public function setData(array $data) {
        $this->data = $data;
        return $this;
    }
    
    // your code 
}
验证器感知规则

Ruler 还支持验证器感知规则。只需实现所需的接口。

接口混合

您可以像在纯 Laravel 中那样混合使用接口。例如:一个 implicit 规则也可以是 dependent

错误信息

错误信息应放置在 message 方法中,该方法在 Illuminate\Contracts\Validation\Rule 中定义,就像您通常所做的那样。

message 方法是动态调用的,这意味着您可以在您的 Rule 实例中存储消息,并在 message 方法中返回它。

use Henzeb\Ruler\Contracts\ReplacerAwareRule;
use Illuminate\Contracts\Validation\Rule;

class YourRule implements Rule
{
    return string $message = 'Something went wrong';
    
    public __construct($param_1, $paramTwo) {}
    
    public function passes($attribute, $value)
    {
        $this->message = 'Your error message';
        return false;
    }
    
    public function message()
    {
        return return $this->message;
    }
}

它还支持返回数组。当返回数组时,MessageBag 包含了消息,就像它们来自不同的验证规则一样。这样,您的 Rule 可以执行分组验证(例如使用另一个验证器实例)。

替换器

默认情况下,您可以使用 :<number> 来指向一个参数,但如果您想要它们有名称,可以使用 Henzeb\Ruler\Contracts\ReplacerAwareRule 接口。

use Henzeb\Ruler\Contracts\ReplacerAwareRule;

class YourRule implements ReplacerAwareRule
{
    public __construct($param_1, $paramTwo) {}
    
    public function message()
    {
        return ':attribute :param_1 :paramTwo';
    }

    public function replacers(): array
    {
        return [
            'param_1',
            'paramTwo'
        ];
    }
}

参数的顺序与指定的顺序相同。 param_1 将指向 $param_1 的值,依此类推。

闭包

如果您有特定需求,可以向替换器添加一个 Closure。一个 Closure 总是接收当前参数的值、属性名称、其他参数(命名)以及所有正在验证的字段。

class YourRule implements ReplacerAwareRule
{
    public function message()
    {
        return ':attribute :param_1 :paramTwo';
    }

    public function replacers(): array
    {
        return [
            'param_1'=> function(string $value, string $attribute, array $parameters, array $data) {
                return 'any string'.$parameters['paramTwo']
            },
            'paramTwo'
        ];
    }
}

重写Validator解析器

由于Ruler设置了自定义的Validator实例,通过Laravel进行解析,如果你想要更改解析器,需要扩展Henzeb\Ruler\Validator\RulerValidator类。

测试

composer test

变更日志

有关最近变更的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全

如果你发现任何与安全相关的问题,请通过电子邮件henzeberkheij@gmail.com联系,而不是使用问题跟踪器。

致谢

许可证

GNU AGPLv. 更多信息请参阅许可证文件