企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] * * * * * ## 1 更新简介 ### 1-1 验证类Validate 添加验证类\library\think\Validate.php ### 1-2 助手函数helper.php 助手文件helper.php有关单字母函数名称修改 ### 1-3 Db驱动Db\ 数据库驱动\library\think\Db\ 进行重构 ### 1-4 其他更新小结 模板后缀更新等 ## 2 验证类 ###2-1 验证类简介 >[info] 验证类的实现在\library\think\Validate.php >[info] 验证类用来对输入数据进行验证, >[info] 使用I方法获取数据库,创建验证类对象,对数据进行规则验证 使用方法见 [官方文档](http://www.kancloud.cn/manual/thinkphp5/129352) 具体使用时,将其中的$data换成I方法获取的输入数据即可 ###2-2 使用方法 >[info] 1 创建验证类Validate的对象,对数据进行验证 ~~~ ; 创建Validate对象,对输入数据进行验证。将$data替换为I()方法获取的输入数据 $validate = new Validate([ 'name'=>'require|max:25', 'email'=>'email' ]); $data = [ 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com' ]; if(!$validate->check($data)){ dump($validate->getError()); } ~~~ >[info] 2 模型中使用验证 ~~~ ;实例:模型调用validate()方法进行输入数据验证 $User = M('User'); $data = $User->validate( [ 'name' => 'require|max:25', 'email' => 'email', ], [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'email' => '邮箱格式错误', ] )->create($data); if(!$data){ // 验证失败 输出错误信息 dump($User->getError()); } ~~~ >[info] 3 继承think\Controller类 调用validate()方法 ~~~ ;实例 在具体控制器中调用validate()方法 $result = $this->validate( [ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com', ], [ 'name' => 'require|max:25', 'email' => 'email', ]); if(true !=== $result){ // 验证失败 输出错误信息 dump($result); } ~~~ >[info] 4 在模型或控制器中调用验证类 ~~~ ;定义验证类 namespace app\index\validate; use think\Validate; class User extends Validate { protected $rule = [ 'name' => 'require|max:25', 'email' => 'email', ]; protected $message = [ 'name.require' => '用户名必须', 'email' => '邮箱格式错误', ]; protected $scene = [ 'add' => ['name,'email'], 'edit' => ['email'], ]; } ;调用同名称验证类与模型进行验证 $User = M('User'); $data = $User->validate(true)->create($data); if(!$data){ dump($User->getError()); } ;调用不同名称类与模型进行验证 $User = M('User'); $data = $User->validate('Member')->create($data); if(!$data){ dump($User->getError()); } ;模型中场景使用 $User = M('User'); $data = $User->validate('User.edit')->create($data); if(!$data){ dump($User->getError()); } ;控制器调用验证类型进行验证 $result = $this->validate($data,'User'); if(true !=== $result){ dump($result); } ;控制器使用场景调用验证类 $result = $this->validate($data,'User.edit'); if(true !=== $result){ dump($result); } ~~~ ###2-3 源代码分析(Validate.php) >[info] 成员变量 ~~~ ;验证器实例对象,单一实例实现 protected static $instance = null; ;验证方法类型,方法别名 protected static $type = []; protected $alias = [ '>' => 'gt', '>=' => 'egt', '<' => 'lt', '<=' => 'elt', '=' => 'eq', 'same' => 'eq', ]; ;验证规则,验证提示信息,默认验证方法提示信息 protected $rule = []; protected $message = []; protected static $typeMsg ;当前验证场景,正则规则,场景规则,错误信息,是否批量验证 protected $currentScene protected $regex = []; protected $scene = []; protected $error = []; protected $batch = false; ~~~ >[info] public 成员方法(验证接口调用) * * * * * #### 构造函数 __construct() ~~~ public function __construct(array $rules = [], $message = []) ~~~ > $ruls:验证规则 字段的验证方法 > $message:提示信息 验证报错提示语 ~~~ ;实例 $rule定义,$msg定义。使用时将$data换成I()方法获取的输入数据即可 $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; $msg = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄必须在1~120之间', 'email' => '邮箱格式错误', ]; $data = [ 'name' => 'thinkphp', 'age' => 121, 'email' => 'thinkphp@qq.com', ]; $validate = new Validate($rule,$msg); $result = $validate->check($data); if(!$result){ echo $validate->getError(); } ~~~ #### 实例化验证器 make() ~~~ public static function make($rules = [], $message = []) ~~~ > $ruls:验证规则 字段的验证方法 > $message:提示信息 验证报错提示语 > 说明:将Validate作为静态类使用创建验证实例对象, #### 添加字段验证规则 rule() ~~~ public function rule($name, $rule = '') ~~~ > $name:验证的字段名称 > $rule:字段验证规则 ~~~ ;实例:使用rule()方法添加对zip字段的验证规则 $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', ]; $validate = new \Validate($rule); $validate->rule('zip', '/^\d{6}$/'); $validate->rule([ 'email' => 'email', ]); ~~~ #### 添加验证方法实现 extend() ~~~ public static function extend($type, $callback = null) ~~~ > $type :字段验证规则 > $callback: 验证规则回调方法 ~~~ 实例:使用extend()添加验证规则方法 $validate = new Validate(['name' => 'checkName:1']); $validate->extend('checkName', function ($value, $rule) { return $rule == $value ? true : '名称错误'; }); $data = ['name' => 1]; $result = $validate->check($data); ~~~ ~~~ 实例:使用extend()添加多个验证规则方法 $validate = new Validate(['name' => 'checkName:1']); $validate->extend([ 'checkName'=> function ($value, $rule) { return $rule == $value ? true : '名称错误'; }, 'checkStatus'=> [$this,'checkStatus'] ]); $data = ['name' => 1]; $result = $validate->check($data); ~~~ #### 设置验证方法提示语 setTypeMsg() ~~~ public static function setTypeMsg($type, $msg = null) ~~~ > $type:验证规则类型 > $msg :提示语 ~~~ 实例:使用setTypeMsg()添加验证规则类型提示语 $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; $msg = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄必须在1~120之间', 'email' => '邮箱格式错误', ]; $data = [ 'name' => 'thinkphp', 'age' => 121, 'email' => 'thinkphp@qq.com', ]; $validate = new Validate($rule); $validate = $validate->setTypeMsg($msg); $result = $validate->check($data); if(!$result){ echo $validate->getError(); } ~~~ #### 设置字段提示信息 message() ~~~ public function message($name, $message = '') ~~~ > $name:字段名称 > $message:提示信息 #### 设置验证场景 scene() ~~~ public function scene($name, $fields = null) ~~~ > $name:验证场景 > $fields: 当前场景验证字段 ~~~ ;实例:使用scene()定义场景下特定字段的验证 ;edit场景下只验证name和age字段 $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; $msg = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄只能在1-120之间', 'email' => '邮箱格式错误', ]; $data = [ 'name' => 'thinkphp', 'age' => 10, 'email' => 'thinkphp@qq.com', ]; $validate = new Validate($rule); $validate->scene('edit', ['name', 'age']); $result = $validate->scene('edit')->check($data); ~~~ #### 设置批量验证 batch() ~~~ public function batch($batch = true) ~~~ > $bacth:开启与关闭批量验证 #### 开始验证数据 check() ~~~ public function check(&$data, $rules = [], $scene = '') ~~~ > $data 需要检测的数据 > $rules: 验证使用的规则,默认使用当前类型的规则属性 > $scene: 验证的场景, 默认使用scene()设置的场景属性 ~~~ ;使用check()对$data数据进行验证 $validate = new Validate([ 'name'=>'require|max:25', 'email'=>'email' ]); $data = [ 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com' ]; if(!$validate->check($data)){ dump($validate->getError()); } ~~~ #### 获取错误提示信息 getError() ~~~ public function getError() ~~~ >[info] protected成员方法(内部实现机制) ~~~ ;对单个字段进行验证 protected function checkItem($field, $value, $rules, &$data, $title = '', $msg = []) ;验证token令牌 protected function token($value, $rule, $data) ;各种验证规范实现回调 返回布尔类型值 protected function confirm($value, $rule, $data) protected function egt($value, $rule) protected function gt($value, $rule) protected function elt($value, $rule) protected function lt($value, $rule) protected function eq($value, $rule) protected function is($value, $rule) protected function activeUrl($value, $rule) protected function ip($value, $rule) protected function method($value, $rule) protected function dateFormat($value, $rule) protected function unique($value, $rule, $data, $field) protected function behavior($value, $rule, $data) protected function filter($value, $rule) protected function requireIf($value, $rule, $data) protected function requireCallback($value, $rule, $data) protected function requireWith($value, $rule, $data) protected function in($value, $rule) protected function notIn($value, $rule) protected function between($value, $rule) protected function notBetween($value, $rule) protected function length($value, $rule) protected function max($value, $rule) protected function min($value, $rule) protected function after($value, $rule) protected function before($value, $rule) protected function expire($value, $rule) protected function allowIp($value, $rule) protected function denyIp($value, $rule) protected function regex($value, $rule) ;获取字段子,获取验证规则提示信息,获取验证场景 protected function getDataValue($data, $key) protected function getRuleMsg($attribute, $title, $type, $rule) protected function getScene($scene = '') ~~~ ## 3 助手函数 ###3-1 助手函数修改简介 >[info] 助手函数改用use导入相关类 >[info] 助手函数有关方法名称发生变动 ###3-2 方法名称改动 ~~~ M() 改为 model() U() 改为 url() R() 改为 action() S() 改为 cache() V() 改为 view() 添加 controller() 方法 实例化控制器 添加 route() 方法 注册路由规则 ~~~ ## 5 其他修改 ###5-1 模板后缀 模板后缀修改为.php