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',
        ];
    }
}

测试效果#

hyperf控制器注解验证器

验证器优先级#

类注解 > 方法注解
在类中使用的话,会在每个方法的验证器前进行验证可以理解为整个类的中间件,在方法中使用的话,就只会对这个方法进行验证
同时他们两个可以结合起来,比如我在 类中使用的场景是 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 方法#

hyperf控制器注解验证器

访问 test 方法#

hyperf控制器注解验证器

同时还具备自定义提供数据接口#

#发布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 协议》,转载必须注明作者和本文链接
这片绿茵从不缺乏天才,努力才是最终的入场券
zds