验证事件类

目前支持的验证事件为

  • 验证前事件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来指定一个事件类以外, 你也可以直接afterbefore来进行简单定义。而不需要去定义一个类

在自定义验证场景中,可使用afterbefore方法定义要使用的事件处理方法,不限数量

  • 场景验证前事件 before
  • 场景验证后事件 after

方法接受一个验证数据array $data参数

与事件类event同用时的执行顺序为:beforeValidate->before->after->afterValidate

提示

如果想更改执行顺序,可以在自定义验证场景中使用setEventPriority方法

方法仅限本类的方法,方法的命名规则为afterbefore加方法名,如:

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自定义验证场景中也支持Closurecallable

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

事件中可以直接返回messagekey值,如user.required,验证器会自动查找对应的错误消息。