# 自定义验证规则
### [](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);
}
~~~
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图