数据库 - Model 前置说明
官方开源项目 抓取代理IP

介绍

@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=""

    • 功能:是否全部字段校验完成后再结束验证
    • 值单位truefalsefalse表示只要一个规则验证不通过,则直接中止向下验证。
    • 默认值:读取验证器中定义的
  • 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('测试 绑定多个验证器');
    }
}

SW-X

企业级 - 高性能 PHP 框架

最后更新:3年前 . 作者-小黄牛

本篇目录