背景描述
在使用ThinkPHP的过程中,发现这样一个问题。有时候我们要验证一个参数的格式是否正确,然而ThinkPHP内置的验证规则却没有,那只有去自定义函数了。今日在研究框架底层时,特意去研究了一下框架的验证底层逻辑,便总结下来(使用的框架是ThinkPHP5.1.37版本的)。由于内容很简单,很多东西都在下面的两段代码,因此本文的文字内容基本是废话,主要看代码,主要看代码,主要看代码。
代码实践
.控制器代码
代码语言:javascript复制//****** 该函数为控制器中的代码
/**
* 测试自定义验证方法
*/
public function index()
{
$id = '1a';
//****** 该验证类为你自定义的验证类,需要使用use进来,具体内容见下方
$testValidate = new TestValidate();
$result = $testValidate->check(['id' => $id]);
if ($result) {
// 这里写自己的具体业务逻辑
echo '参数验证通过';
} else {
// 获取验证信息
dump($testValidate->getError());
}
}
.验证类代码
代码语言:javascript复制//****** 该函数为控制器中的代码
use thinkValidate;
class TestValidate extends Validate
{
// 设置验证规则(这里的paramIsNum就是自定义的验证规则)
protected $rule = [
'id' => 'require|paramIsNum'
];
/**
* 自定义验证规则
* @param string $value 验证内容
* @param string $rule 验证规则
* @param $data
* @param string $field 验证的字段名
* @return bool
*/
protected function paramIsNum($value = '', $rule = '', $data, $field)
{
if (is_numeric($value)) {// 参数验证
return true;
} else {
return $field . '参数格式不正确!';
}
}
}
.运行结果
代码语言:javascript复制// 当我们的变量$id = 1时;输出的结果为:
参数验证通过
// 当我们的变量$id != 1时;输出的结果为:
$id. '参数格式不正确!'
底层逻辑分析
其实通过看源码很容易就能理解到这样做的原因。你需要明确以下几个点: 1.验证规则其实在验证类的底层是一个方法的形式. 如内置的require验证,其实就是底层的一个require方法. 2.我们自定义的验证类是继承了父类Validate类的. 通过oop思想,我们知道既然继承了父类的,我们可以给父类进行重写、重载等操作. 3.实现自定义方法 通过上面两点,我们就明白我们自定义的方法其实就是类似于在父类中去写了一个我们自定义的方法一样.