验证事件类
目前支持的验证事件为
- 验证前事件
beforeValidate
- 验证后事件
afterValidate
验证器中间件需要继承Itwmw\Validate\Support\Event\ValidateEventAbstract
事件类拥有三个类属性
$sceneName
当前的场景名称$data
验证前的值或验证后的值$message
错误消息,如果事件返回false
,则验证器将取此值作为错误消息
abstract class ValidateEventAbstract implements ValidateEventInterface
{
public function beforeValidate(): bool;
public function afterValidate(): bool;
}
场景事件处理类构建函数中可以取到传递过来的值
如场景中使用了event(CheckPermission::class,1,2,3)
,则构建函数
public function __construct($a,$b,$c)
{
}
可依次获取到$a = 1
$b = 2
$c = 3
场景事件
可在验证场景中使用event
关键词,此时的事件为场景事件:
如果不需要给场景事件处理类传值:
protected $scene = [
'add' => ['id','user_id','role','event' => CheckPermission::class],
];
如果需要给场景事件处理类传值:
protected $scene = [
'add' => ['id','user_id','role','event' => [
CheckPermission::class=>[1,2,3,4]
]],
];
传值的数量不限制,可在场景事件处理类的构建函数中获取
给自定义场景指定事件
在自定义验证场景中,可使用event
方法定义要使用的场景事件处理类,不限数量
/*
* @method $this event(string $handler,...$params)
*/
$scene->event(CheckPermission::class)
如果要传值
$scene->event(CheckPermission::class,1,2,3)
使用多个场景事件处理类
$scene->event(CheckPermission::class,1,2,3)->event(CheckName::class)
全局事件
如果你需要验证器验证前以及验证后执行一些操作,你就需要用到全局事件。
protected $event = [
CheckPermission::class => ['owner']
];
可定义多个全局事件处理器。
场景事件方法
如果你需要在该场景验证前或者验证后执行一些操作,除了使用event
来指定一个事件类以外, 你也可以直接after
和before
来进行简单定义。而不需要去定义一个类
在自定义验证场景中,可使用after
和before
方法定义要使用的事件处理方法,不限数量
- 场景验证前事件
before
- 场景验证后事件
after
方法接受一个验证数据array $data
参数
与事件类event
同用时的执行顺序为:beforeValidate
->before
->after
->afterValidate
提示
如果想更改执行顺序,可以在自定义验证场景中使用setEventPriority方法
方法仅限本类的方法,方法的命名规则为after
或before
加方法名,如:
class LoginValidate extends \Itwmw\Validate\Validate
{
protected $rule = [
'name' => 'required|chs',
'user' => 'required|alpha_dash',
'pass' => 'required|min:8',
];
protected $scene = [
'register' => ['name', 'user', 'pass', 'before' => 'checkRegisterStatus']
];
public function beforeCheckRegisterStatus(array $data)
{
return true;
}
}
场景事件方法也可以为方法传递参数,传参方法相同,只不过要将类名换为方法名,第一个参数为当前验证的值或者验证后的值
protected $message = [
'user.required' => '用户名不可为空'
];
protected $scene = [
'register' => ['name', 'user', 'pass', 'before' => 'setDefaultName','after'=> [
'checkUserExist' => [1,2,3,4]
]]
];
public function afterCheckUserExist(array $data,$a,$b,$c)
{
return true;
}
同样可依次获取到$a = 1
$b = 2
$c = 3
在自定义验证场景中也支持Closure
和callable
protected function sceneLogin(\Itwmw\Validate\Support\ValidateScene $scene)
{
$scene->only(['user', 'pass', 'captcha'])
->before(function ($data) {
// TODO::判断验证码是否正确
})
->after(function ($data) {
// TODO::判断账号密码是否正确
});
}
返回值
如果返回的是字符串,则抛出Itwmw\Validate\Exception\ValidateException
异常,代表未通过,如果通过,则返回True
事件中可以直接返回message
的key
值,如user.required
,验证器会自动查找对应的错误消息。