henzeb / ruler-laravel
使用自己的 Rule 接口扩展 Laravel 的验证器
Requires
- php: ^8.1
- illuminate/support: ^10|^11
Requires (Dev)
- orchestra/testbench: ^8.0|^9.0
- phpunit/phpunit: ^9.0|^10
README
这个库允许您将您的 Rule 作为字符串使用,就像使用现有的验证器如 required
、required_if
或 unique
一样。
例如: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. 更多信息请参阅许可证文件。