💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 自定义验证规则 ### [](https://octobercms.com/docs/services/validation#custom-validation-rules)自定义验证规则 #### 注册自定义验证规则 有多种有用的验证规则;但是,您可能希望自己指定一些。 建议添加自己的验证规则的方法是通过`extend`方法扩展Validator实例。在October CMS插件中,可以将其添加到注册文件中的`boot()`回调方法中`Plugin.php`。 您可以使用自定义验证规则将Validator实例扩展为`Closure`或`Rule`对象。 #### 使用闭包 如果只需要在整个插件或应用程序中指定一次的自定义规则的功能,则可以使用Closure定义规则。第一个参数定义规则的名称,第二个参数提供闭包。 ~~~ use Validator; public function boot() { Validator::extend('foo', function($attribute, $value, $parameters) { return $value == 'foo'; }); } ~~~ 定制验证程序Closure接收三个参数:`$attribute`被验证的名称,`$value`属性的和`$parameters`传递给规则的数组。 您也可以将类和方法传递给`extend`方法,而不是传递给Closure: ~~~ Validator::extend('foo', 'FooValidator@validate'); ~~~ 使用您的自定义规则扩展验证器后,您需要将其添加到规则定义中。例如,您可以将其添加到`$rules`模型的数组中。 ~~~ public $rules = [ 'field' => 'foo' ]; ~~~ #### 使用规则对象 一个`Rule`对象表示您的模型实现了一个可重复使用的验证规则`Illuminate\Contracts\Validation\Rule`的合同。每个规则对象必须提供三种方法:`passes`确定给定值是否通过验证的`validate`方法,在验证时调用的`message`方法以及定义默认后备错误消息的方法。 ~~~ <?php use Illuminate\Contracts\Validation\Rule; class Uppercase implements Rule { /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { return strtoupper($value) === $value; } /** * Validation callback method. * * @param string $attribute * @param mixed $value * @param array $params * @return bool */ public function validate($attribute, $value, $params) { return $this->passes($attribute, $value); } /** * Get the validation error message. * * @return string */ public function message() { return 'The :attribute must be uppercase.'; } } ~~~ 要使用您的规则对象扩展Validator,您可以将类的实例提供给Validator`extend`方法: ~~~ Validator::extend('uppercase', Uppercase::class); ~~~ `Rule`对象应存储在插件目录内的**/ rules**子目录中。 #### 定义错误信息 您还需要为自定义规则定义错误消息。您可以使用嵌入式自定义消息数组,也可以通过在验证语言文件中添加条目来实现。此消息应放置在数组的第一级。 ~~~ "foo" => "Your input was invalid!", "accepted" => "The :attribute must be accepted.", ~~~ 对于`Rule`对象,您可以通过提供`message`返回字符串的方法来设置后备错误消息。 创建自定义验证规则时,有时可能需要为错误消息定义自定义占位符替换。您可以通过`replacer`在Validator外观上调用该方法来实现。您也可以在`boot`插件的方法中执行此操作。 ~~~ public function boot() { Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) { // return a message as a string }); } ~~~ 回调接收4个参数:`$message`是验证者返回的消息,是验证`$attribute`失败的属性,`$rule`是规则对象以及`$parameters`是使用验证规则定义的参数。例如,您可以将列名插入到参数中定义的消息中: ~~~ public function boot() { Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) { return str_replace(':column', $parameters[0], $message); }); } ~~~ 如果希望通过错误消息支持多种语言,则需要`translator.beforeResolve`在插件中监听事件,因为`boot`在完全启用翻译支持之前,可以运行插件的方法。 ~~~ public function boot() { Event::listen('translator.beforeResolve', function ($key, $replaces, $locale) { if ($key === 'validation.uppercase') { return Lang::get('plugin.name::lang.validation.uppercase'); } }); } ~~~ #### 注册自定义验证程序解析器 如果希望为应用程序提供大量自定义规则,则还可以定义验证程序解析器。请注意,每个Validation实例只能定义一个解析器,因此不建议在插件中定义解析器,除非您使用自己的Validation实例而不是全局Validator外观。 要定义解析器,您可以`resolver`在Validator外观中为该方法提供一个Closure。 ~~~ Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes) { return new CustomValidator($translator, $data, $rules, $messages, $customAttributes); }); ~~~ 解析器支持的每个规则都是使用`validateXXX`方法定义的。例如,`foo`验证规则将寻找称为的方法`validateFoo`。该`validate`方法应返回一个布尔值,关于给定是否`$value`通过验证。 ~~~ public function validateFoo($attribute, $value, $parameters) { // return whether the value passes validation } ~~~ 与Validator`replacer`方法一样,有时可能需要为错误消息定义自定义占位符替换。您可以通过定义`replaceXXX`方法在解析器中执行此操作。 ~~~ protected function replaceFoo($message, $attribute, $rule, $parameters) { return str_replace(':foo', $parameters[0], $message); } ~~~