@Validate()
注解,主要用于执行某个验证器下的验证场景。
该注解,共支持6
个参数设置。
注意:若需要使用@Validate()
注解,则需要先创建对应的验证文件,否则无法使用。具体可以参考验证器的相关文档。
场景:对路由绑定验证器对应的场景设置。
支持:
HTTP
(2.5.6起)、
WebSocket
(2.5.6起)、
Rpc
(2.5.6起)、
MQTT
(2.5.6起)
注解:@Validate()
参数:
class=""
scene=""
filter=""
,
英文状态下的逗号分隔field=""
,
英文状态下的逗号分隔batch=""
true
或false
,false
表示只要一个规则验证不通过,则直接中止向下验证。callback=""
\box\lifecycle\validate_error
注意:使用@Validate()
注解时,class=""
和scene=""
这两个属性都是必填的。
一个完整的@Validate注解使用大概如下:
我们先创建一个会员相关的验证器,命名空间是:\box\validate\User
,代码如下:
<?php
namespace box\validate;
use x\Validate;
class User extends Validate
{
// 全部检测
protected $batch = false;
// 定义字段对应的规则
protected $rule = [
'id' => 'require|int',
'name' => 'require|username|between:1,120',
'age' => 'between:1,100',
'email' => 'email',
'info.nick' => 'alphaNum|min:10|max:20',
];
// 自定义错误值声明
// 字段名太长,可以用{:preset}代替,这是框架内置的字段名占位符
// 更多参数,按顺序用{0-N}的方式书写占位符
protected $message = [
'id.require' => '{id}忘记输入啦',
'name.username' => '{name}不规范',
'info.nick.min' => '{:preset}不能小于{0}',
];
// 可以设置message时的字段别名,会把{字段名}占位符替换后一起抛出
protected $alias = [
'id' => 'ID值',
'name' => '用户名',
];
// 场景定义
protected $scene = [
// 修改时使用的场景(简写)
'edit' => ['id','name','age','email','info.nick'],
// 新增时使用的场景(精致)
'create' => [
'field' => ['name','age','email','info.nick'], // 需要校验的字段
'filter' => ['email'], // 移除校验的字段
'add_rule' => [ // 追加校验规则
'age' => 'number',
],
'delete_rule' => [ // 删除校验规则
'name' => 'require|between',
],
],
];
}
创建一个HTTP控制器进行测试:
<?php
namespace app\http;
use x\controller\Http;
class Index extends Http
{
/**
* @RequestMapping(route="/create", method="GET", title="新增的场景测试")
* @Validate(class="\box\validate\User", scene="create")
*/
public function param() {
return $this->fetch('测试 User验证器 新增时场景');
}
/**
* @RequestMapping(route="/edit", method="GET", title="修改的场景测试")
* @Validate(class="\box\validate\User", scene="edit")
*/
public function param() {
return $this->fetch('测试 User验证器 修改时场景');
}
}
如果我们修改时,想临时指定只使用edit
场景里的哪几个字段,就可以使用field
参数:
/**
* @Validate(class="\box\validate\User", scene="edit", field="age,email,id")
*/
如果场景中的字段很多,临时只想移除某几个字段,就可以使用filter
参数:
/**
* @Validate(class="\box\validate\User", scene="edit", filter="id,info.nick")
*/
@Validate
注解支持对同一条路由绑定多次,如果您需要绑定多个不同的验证器,又或者是多个场景,可以这样用(会从上往下解析执行):
<?php
namespace app\http;
use x\controller\Http;
class Index extends Http
{
/**
* @RequestMapping(route="/test", method="GET", title="测试绑定多个验证器")
* @Validate(class="\box\validate\Shop", scene="A1")
* @Validate(class="\box\validate\Car", scene="B1")
* @Validate(class="\box\validate\User", scene="edit")
*/
public function param() {
return $this->fetch('测试 绑定多个验证器');
}
}