验证器

验证器应该是我们在使用TP,Laravel这些框架的时候经常遇到的,英文名Validate,为什么要验证器呢?数据验证应该是所有web api的第一步,通过校验前端数据的是否合法,来进行数据的接下来的操作,如果数据不合法,直接退回给前端,而不用执行。

Laravel

1
2
3
4
5
6
//验证数据的正确性
$this->validate($request, [
'name'=>'required|max:50',
'email'=>'required|email|unique:users|max:255',
'password'=>'required|confirmed|min:6'
]);

TP

1
2
3
4
5
6
7
8
9
10
protected $rule = [
'name' => 'require|isNotEmpty',
'mobile' => 'require|isMobile',
'province' => 'require|isNotEmpty',
'city' => 'require|isNotEmpty',
'country' => 'require|isNotEmpty',
'detail' => 'require|isNotEmpty'
];

$result = $this->batch()->check($param);

其实两个很类似,就是通过传入验证条件和接受到的参数,来进行对应规则的验证.

自己

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
namespace Libs;

use Framework\Exception\ClientException;
use Framework\Exception\ServerException;

class Validate
{
static $res = true;
static $errMsg = '';

/**
* @param $arr, 传入的验证规则
* @param $params, 请求的数据
* @throws ClientException
*/
public static function validate($arr, $params)
{
foreach ($arr as $a_key=>$a_value) {
$funcArr = explode('|', $a_value);
foreach ($funcArr as $f_key=>$f_value) {
if(is_callable([__CLASS__, $f_value])) {
call_user_func_array([__CLASS__, $f_value], [$a_key, $params]);
} else {
throw new ServerException('', '你的验证函数名不存在啦');
}
}
}
if(self::$res == false) {
throw new ClientException('', self::$errMsg);
}
}

public static function required($key, $arr)
{
if (!key_exists($key, $arr)) {
self::$res = false;
self::$errMsg .= $key.'不存在 | ';
}
}


public function __call($name, $arguments)
{
throw new ServerException('', '你的验证函数名不存在啦');
}
}

controller调用

1
2
$validate = ['comment_id'=>'required|test' ,'sex'=>'required'];
Validate::validate($validate, static::params());

需要注意的点是:

  1. 上面验证器的使用过程中并不是检测到错误就立刻返回,而是检测出所有的错误再返回,所以我定义了两个static用来存储数据,当标志位是false的时候再把存储的错误信息一起返回。
  2. is_callable函数的使用,验证函数是否能执行,如果是类中,[‘类名’, ‘方法名’], 都是字符串,注意这个类名用__CLASS__,之前我直接写的Validate,这样肯定是不行的,同理call_user_func_array这个也是,相比较于call_user_func,这个是后面传入函数中的参数要以array的形式,如果是非静态函数,就传入类名,静态的话要传入对象哦,$this,或者new一个对象吧。call_user_func_array is_callable
  3. 需要注意static的使用,用的self哦,一般的使用用的this(都是在类中),在类的外面的话,static 是 类名::,非static用的是 object->func.
  4. __call 是类中不存在这个方法的时候调用会自动执行,传入的两个参数第一个是调用的方法名,第二个参数是参数.
坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------