hyperf控制器注解验证器
继上一篇自己写的一个hyperf扩展 自己做了一些扩展,现在支持了控制器验证,或者说任意类的验证
在控制器中使用
use DeathSatan\Hyperf\Validate\Annotation\Validate;
/**
* 整个控制器中进行数据校检
* @Validate(validate=Index::class,scene="demo")
*/
class IndexController extends AbstractController
{
/**
* 在控制器中某个方法内进行数据校检
* @Validate(validate=Index::class,scene="demo")
*/
public function index()
{
$user = $this->request->input('demo', 'Death-Satan');
$method = $this->request->getMethod();
return [
'method' => $method,
'message' => "Hello {$user} ",
];
}
}
Validate验证器
use DeathSatan\Hyperf\Validate\Lib\AbstractValidate as BaseValidate;
class Index extends BaseValidate
{
/**
* @var array 自定义场景
*/
protected $scenes = [
'demo'=>[
'nickname'
],
'demo2'=>[
'password'
]
];
/**
* 规则.
*/
protected function rules(): array
{
return [
'nickname'=>'required',
'password'=>'required',
];
}
}
测试效果
验证器优先级
类注解 > 方法注解
在类中使用的话,会在每个方法的验证器前进行验证可以理解为整个类的中间件,在方法中使用的话,就只会对这个方法进行验证
同时他们两个可以结合起来,比如我在 类中使用的场景是demo,在方法内使用的场景是demo2
验证失败验证失败会抛出一个 DeathSatan\Hyperf\Validate\Exceptions\ValidateException
异常,此异常还需要手动去捕获
/**
* 整个控制器中进行数据校检
* @Validate(validate=Index::class,scene="demo")
* @AutoController()
*/
class IndexController extends AbstractController
{
/**
* 在控制器中某个方法内进行数据校检
* @Validate(validate=Index::class,scene="demo2")
*/
public function index()
{
$user = $this->request->input('demo', 'Death-Satan');
$method = $this->request->getMethod();
return [
'method' => $method,
'message' => "Hello {$user} ",
];
}
public function test()
{
return [
'msg'=>'不会进行demo2的验证,但会进行demo的验证'
];
}
}
运行结果
访问index方法
访问test方法
同时还具备自定义提供数据接口
#发布validate配置文件
php bin/hyperf vendor:publish death_satan/validate
自定义数据提供者需要实现\DeathSatan\Hyperf\Validate\Contract\CustomHandle
契约接口,实现完成后,需要在config/autoload/validate.php
中配置你的自定义提供者
validate.php
<?php
return [
/**
* --------------------------------------------------------------------------------
* 自定义数据提供者.
* 如果你想自己向验证器提供数据,那么可以尝试修改这个选项
* 指定类名,如果不存在则会抛出\RuntimeException异常
* 请让你的自定义数据提供者实现\DeathSatan\Hyperf\Validate\Contract\CustomHandle契约.
* 只有这样它才不会抛出异常.
* --------------------------------------------------------------------------------
*/
'customHandle'=>\DeathSatan\Hyperf\Validate\Driver\RequestHandle::class,
];
\DeathSatan\Hyperf\Validate\Contract\CustomHandle
/**
* 自定义提供validate契约
*/
interface CustomHandle
{
/**
* 自定义验证数据
* @param object $current 当前使用Validate注解验证的对象。它会是任何对象。也许你可以用到 ($current instanceof 类名) 来验证它是否需要你来进行处理
* @param AbstractValidate $validate 当前Validate注解所使用的 验证器对象
* @param string|null $scene 当前Validate注解所使用的场景,默认情况下它是null
* @return array
*/
public function provide(object $current, AbstractValidate $validate,string $scene = null):array;
}
可以在自定义提供接口处根据当前注释的对象以及验证器还有场景来动态提供数据
本作品采用《CC 协议》,转载必须注明作者和本文链接