Structure

A useless validator

应用场景

示例

验证场景

namespace YoursNamespace;
use Structure\Struct;
class User extends Struct {

    // 当id为非null值时,必须满足int 10 < id < 20
    /**
     * @rule int,min:10,max:20|id format error:1001
     */
    public $id; 
    
    // name为必填,必须满足string 1 < name长度 < 20
    /**
     * @rule string,min:1,max:20|name format error:2001
     * @required true|name cannot be empty:2002 
     */
    public $name;
    
    // 当sex为null时默认 string female
    // 满足string 0 < sex长度 < 10
    /**
     * @rule string,min:0,max:10|sex format error:1001
     * @default string:female
     */
    public $sex;
}
    $struct = \YoursNamespace\User::factory();
    $struct->create([
        'id' => 12,
        'name' => 'John Smith'
    ]);
    
    // or
    
    $struct = \YoursNamespace\User::factory([
        'id' => 12,
        'name' => 'John Smith'
    ]);
    
    // or
    
    $struct = new \YoursNamespace\User();
    $struct = \YoursNamespace\User::factory();
    
    $struct->id = 12;
    $struct->name = 'John Smith';
    
    // or
    
    $struct = new \YoursNamespace\User([
        'id' => 12,
        'name' => 'John Smith'
    ]);
    

    if($struct->hasError()) {
        throw new \RuntimeException(
            $struct->getError()->getMessage() . '->' . $struct->getError()->getPosition(),
            $struct->getError()->getCode()
        );
    }
    return $struct->output(); // array

使用说明

namespace Example;

use Structure\Struct;

class User extends Struct{
    public $id;
    public $name;
    public $sex;
}
    /**
     * @rule string,min:10,max:20|name format error:1001 
     */
    public $name;
/**
 *  a区   b区        c区              d区
 * @标签 [场景]   验证方式   | 错误信息     : 错误码
 *      ↓           ↓           ↓             ↓
 * @rule[check] string,min:1|error message:error code  
 */                       

标签区

标签名 方式 类型 说明
@default Structure\Handler、func、method 转换 func与method是将返回值默认赋予该标签
@required true 验证 判断是否为必要值
@rule Structure\Handler、func、method 验证 以func与method的bool返回类型判断验证
@skip 验证 跳过验证
@ghost 转换 跳过输出
@key 转换 标记钥匙属性
@mapping 映射键名 转换 映射键转换
@operator true、func、method 转换 键值特殊转换

@default

    /**
     * @default string:abc
     * @default int:123
     * @default float:1.1
     * @default object:Handler\Help
     * @default map:{"a":"1"}
     * @default array:["1"]
     * @default bool:true
     */
    public $name;
    /**
     * @default func:is_array              会找到is_array函数
     * @default method:_set                会定位当前类的_set方法
     * @default method:Handler\Help,get   会定位Handler\Help类的get方法 
     */
    public $name;
    
    public static function _set(){
        return 'abc';
    }
    // 以name的@default标签为string:John举例
    /**
     * @default string:John
     */
    public $name;
    $struct = new Struct();
    // @default无法生效,值为null
    $struct->name;
    
    // @default可以生效,值为字符串John
    $struct()->name;

@required

    /**
     * @required true|name cannot empty
     */
    public $name;

@rule

    /**
     * @rule string,min:10,max:20|name format error
     * @rule int,min:10,max:20|name format error
     * @rule float,min:1.0,max:2.1,scale:3|name format error
     * @rule bool,true|name format error
     * @rule object,class:|name format error
     * @rule array,min:10,max:20,values:string|name format error
     * @rule map,min:1,max:5,keys:string,values:int|name format error
     * @rule url,path:true,query:true|name format error
     * @rule ip,ipv4:false,ipv6:false,private:false,reserved:false|name format error
     * @rule regex,min:10,max:20,regex:/.?/|name format error
     */
    public $name;
    /**
     * @rule func:_set                  会找到_set函数
     * @rule method:_set                会定位当前类的_set方法
     * @rule method:Handler\Help,get   会定位Handler\Help类的get方法
     */
    public $name;
    
    public static function _set($value) : bool
    {
        return $value === '_method';
    }


    function _set($value) : bool
    {
        return $value === '_func';
    }

@ghost

    // @ghost true
    $user->id = 'id';

    $user->name = 'name';
    $user->output();
    // 以上会输出
    [
        'name' => 'name'
    ];

    $user->output(true);
    // 以上会输出
    [
        'id' => 'id',
        'name' => 'name'
    ];

@key

    // @key true
    $user->id = 'id';

    $user->name = 'name';
    $user->filter(STRUCT_FILTER_KEY)->output();
    // 以上会输出
    [
        'name' => 'name'
    ];
    
    $user->transfer(STRUCT_FILTER_KEY_REVERSE)->output();
    // 以上会输出
    [
        'id' => 'id',
    ];

@skip

@operator

1. 识别medoo语法-where 并转换

    /**
     * @operator true 
     */ 
    public $name;

通过 transfer()->output() 可以做到转换输出

    // @operator true
    $user->id = 'abc[>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出
    [
        'id[>]' => 'abc'
    ];

    $user->id = '123,456[<>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出
    [
        'id[<>]' => ['123','456'],
    ];
2.2以上版本完善了该标签下的类型转换
2.2以下版本中不会对类型转换 ##### 2.2以下版本:
    // @operator true
    $user->id = '123[>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出
    [
        'id[>]' => '123'
    ];
    // 并非期待的
    [
       'id[>]' => 123
    ];
    // 此种状况会影响数据库查询的索引
2.2以上版本:
    // @operator true
    $user->id = '123[>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id[>]' => 123
    ];
    
    // @operator true
    $user->id = '123';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id' => 123
    ];
    
    $user->id = '1.23[>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 float
    [
        'id[>]' => 1.23
    ];

    $user->id = '1.23';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出
    [
        'id' => 1.23
    ];
# String :

    // @operator true
    $user->id = '123[String][>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id[>]' => '123'
    ];
    
    // @operator true
    $user->id = '123[String]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id' => '123'
    ];

# Int :

    // @operator true
    $user->id = '1[Int][>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id[>]' => 1
    ];
    
    // @operator true
    $user->id = '1[Int]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id' => 1
    ];


# Float :

    // @operator true
    $user->id = '123[Float][>]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id[>]' => 123.0
    ];
    
    // @operator true
    $user->id = '123[Float]';
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id' => 123.0
    ];

# Bool :

    // @operator true
    $user->id = '1[Bool][>]'; // 0 false
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id[>]' => true
    ];
    
    // @operator true
    $user->id = '1[Bool]'; // 0 false
    $user->transfer(STRUCT_TRANSFER_OPERATOR)->output();
    // 以上会输出 int
    [
        'id' => true
    ];

2.使用func、method进行转换

    /**
     * @operator func:_add                  相当于_add($name)
     * @operator method:_add                相当于$this->_add($name)
     * @operator method:Handler\Help,_add  相当于Handler\Help::_add($name)
     */
    public $name;

@mapping

    // @mapping key
    $user->id = 123;

    $user->name = 'john';
    $user->output();
    // 输出
    [
        'id' => 123,
        'name' => 'john'
    ];

    $user->transfer(STRUCT_TRANSFER_MAPPING)->output();
    // 输出
    [
        'key' => 123,
        'name' => 'john'
    ];

方法

    $user = User::factory([
        'id' => 1,
        'name' => 'john'
    ],'check');
    // 1.使用create输入数据
    $user->create([
        'id' => 1,
        'name' => 'john'
    ]); // return $this
    // 2.使用属性赋值输入数据
    $user->id = 1;
    $user->name = 'john';

    // 使用create可以保存原始数据,建议使用create输入数据
    $user->getRaw(); // return array
    $user->scene('check'); // return $this
    $user->transfer(STRUCT_TRANSFER_MAPPING); // return $this

    // STRUCT_TRANSFER_MAPPING
    // STRUCT_TRANSFER_OPERATOR

    // 接受可变长参数
    $user->transfer(
        STRUCT_TRANSFER_MAPPING,
        STRUCT_TRANSFER_OPERATOR
    ); // return $this
    $user->filter(STRUCT_FILTER_NULL); // return $this

    // STRUCT_FILTER_NULL
    // STRUCT_FILTER_EMPTY
    // STRUCT_FILTER_ZERO
    // STRUCT_FILTER_KEY
    // STRUCT_FILTER_KEY_REVERSE
    // STRUCT_FILTER_OPERATOR
    // STRUCT_FILTER_OPERATOR_REVERSE

    // 接受可变长参数
    $user->filter(
        STRUCT_FILTER_NULL,
        STRUCT_FILTER_EMPTY
    ); // return $this
    $user->validate(); // return bool
    $user->hasError(); // return bool

    // true 有错误,验证未通过
    // false 无错误,验证通过
    $user->getError(); // return Structure\Error

    $user->getError()->getMessage();  // 错误信息 string
    $user->getError()->getCode();     // 错误码 string
    $user->getError()->getField();    // 字段名 string
    $user->getError()->getPosition(); // 错误定位 对应Handler对应的options字段

    $user->getErrors(); // return Structure\Error[]
    $user->output(); // return array

    $user->output(true); // 全量输出
    $user->clean(); // 默认不装载raw数据

    $user->clean(true); // 装载raw数据

补充

    \Structure\Handler::register();
    try {
        // ...                          
    }catch (\Structure\Exceptions\StructureException $exception){
        $exception->getPosition(); // 错误定位信息
        $exception->getMessage(); // Structure Exception [{position info}]
        $exception->getCode(); // 始终以-666返回
    }