thinkPHP基于反射实现钩子的方法分析_php实例_脚本之家

本文实例讲述了thinkPHP5框架自定义验证器实现方法。分享给大家供大家参考,具体如下:

本文实例讲述了thinkPHP基于反射实现钩子的方法。分享给大家供大家参考,具体如下:

本文实例分析了thinkPHP框架自动填充原理与用法。分享给大家供大家参考,具体如下:

thinkPHP基于反射实现钩子的方法分析_php实例_脚本之家。本文实例讲述了Thinkphp5框架使用validate实现验证功能的方法。分享给大家供大家参考,具体如下:

普通的验证器手册上已经很详细,我们讲解一下如何自定义一个验证器

ThinkPHP框架的控制器模块是如何实现
前控制器、后控制器,及如何执行带参数的方法?

thinkphp有一个自动填充字段的方法

作为前端er,对于验证这块有着切身的体会,虽然逐渐得心应手,但始终没有一个内置的功能拿来就能用。tp5恰好提供一个。本文简单介绍并实现以下。主要是实现一下。

首先我们在模块目录下建立validata文件夹

PHP系统自带的 ReflectionClass、ReflectionMethod
类,可以反射用户自定义类的中属性,方法的权限和参数等信息,通过这些信息可以准确的控制方法的执行。

array( array(完成字段1,完成规则,[完成条件,附加规则]), array(完成字段2,完成规则,[完成条件,附加规则]), ......);

验证的实现基于tp5内置的对象validate。

然后在里面建立一个类,取名为IdMustInt.php

ReflectionClass:

注:研究源码后发现其实还有第4个参数,是给函数或者回调方法传参数用的,参数1默认为该字段值,如:

在Index模块化下index控制器同级目录创建一个validate文件,里面一个Vdate.php验证文件,这个文件也可以放在common目录下面,只要namespace正确就可。代码如下

代码如下:注意,我的模块名为api,所以命名空间如下

hasMethod 是否存在某个方法getMethod 获取方法

array('mobile','trim',3,'function',参数2,参数3'),
["name","parent_id"], ]; }

保护属性$rule为官方规定,不能改变,其实验证规则require都是封装好的函数名,所以我们也建立一个方法,方法名填写在验证规则后面即可

ReflectionMethod:

验证支付动态和静态

可以写多个字段,就如同我注释的。

namespace appapivalidate;use thinkValidate;class IdMustInt extends Validate{ protected $rule = [ 'id' => 'require|IsInt' ]; protected function IsInt($value,$rule,$data,$field){ //参数依次为验证数据,验证规则,全部数据,字段名 //这里我们要判断的验证的数据要求必须为正整型 if && is_int && { return true; }else{ //如果不符合我们的条件,返回错误信息,在控制器中可以用getError()方法输出 return $field.'不是整型'; } }}

isPublic() 是否为 public 方法getNumberOfParameters()
获取参数个数getParamters()
获取参数信息invoke( object $object [, mixed $parameter [, mixed $... ]] )
执行方法invokeArgs(object obj, array args)带参数执行方法

静态验证

 验证数据 

接下来看我们控制器的对应操作

hasMethod { $beforeMethod = $class->getMethod; if ($beforeMethod->isPublic { $beforeMethod->invoke; } } $method->invoke; // 执行后置方法 if ($class->hasMethod { $beforeMethod = $class->getMethod; if ($beforeMethod->isPublic { $beforeMethod->invoke; } }}// 执行带参数的方法$method = new ReflectionMethod;$params = $method->getParameters();foreach  { $paramName = $param->getName(); if (isset($_REQUEST[$paramName])) { $args[] = $_REQUEST[$paramName]; } elseif ($param->isDefaultValueAvailable { $args[] = $param->getDefaultValue == $method->getNumberOfParameters { $method->invokeArgs;} else { echo 'parameters is wrong!';}

/** * 执行App控制器 */public function execApp() { // 创建action控制器实例 $className = MODULE_NAME . 'Controller'; $namespaceClassName = '\apps\' . APP_NAME . '\controller\' . $className; load_class($namespaceClassName, false); if (!class_exists { throw new Exception('Oops! Module not found : ' . $namespaceClassName); } $controller = new $namespaceClassName(); // 获取当前操作名 $action = ACTION_NAME; // 执行当前操作 //call_user_func(array(&$controller, $action)); // 其实吧,用这个函数足够啦!!! try { $methodInfo = new ReflectionMethod($namespaceClassName, $action); if ($methodInfo->isPublic() && !$methodInfo->isStatic { $methodInfo->invoke; } else { // 操作方法不是public类型,抛出异常 throw new ReflectionException(); } } catch (ReflectionException $e) { // 方法调用发生异常后,引导到__call方法处理 $methodInfo = new ReflectionMethod($namespaceClassName, '__call'); $methodInfo->invokeArgs($controller, array; } return;}

在模型类里面预先定义好该模型的自动验证规则,在使用create方法后会自动去验证。

后端控制器index下面对应的validateF

public function getBanner{ //需要验证的数据 $data = [ 'id' => $id, ]; //实例化验证器 $validate = new IdMustInt(); //如果验证数据较多,条件也较多,需要批量返回所有错误信息的话,可以在check()前加上$validata->batch() $result = $validate->check{ //业务逻辑 }else{ dump); }}

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI框架进阶教程》、《Zend
FrameWork框架入门教程》及《PHP模板技术总结》。

1.首先在模型中定义好验证的规则

public function validateF(){ $data=input; print_r; $validate=validate; //使用验证 //scene内置方法 if(!$validate->scene){ $this->error);//内置错误返回 } //剩下操作 $res=model->add{ $this->success; }else{ $this->error; }}

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI框架进阶教程》、《Zend
FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

namespace HomeModel;use ThinkModel;class UserModel extends Model{ protected $_auto = array , // 新增的时候把status字段设置为1 array('password','md5',3,'function') , // 对password字段在新增和编辑的时候使md5函数处理 array('name','getName',3,'callback'), // 对name字段在新增和编辑的时候回调getName方法 array('update_time','time',2,'function'), // 对update_time字段在更新的时候写入当前时间戳 );}

这样就可以了。很简单的实现。关于每个字段的规则,内容很多可以参考手册或者官网吧。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

2.在调用的时候用create方法会自动进行填充

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI框架进阶教程》、《Zend
FrameWork框架入门教程》及《PHP模板技术总结》。

$User = D; // 实例化User对象if { // 创建数据对象 // 如果创建失败 表示验证没有通过 输出错误提示信息 exit;}else{ // 验证通过 写入新增数据 $User->add();}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

动态验证

$rules = array , // 新增的时候把status字段设置为1 array('password','md5',3,'function') , // 对password字段在新增和编辑的时候使md5函数处理 array('update_time','time',2,'function'), // 对update_time字段在更新的时候写入当前时间戳);$User = M;$User->auto;$User->add();

下面是核心的代码分析:

create方法调用后会调用autoOperation方法,方法如下

/** * 自动表单处理 * @access public * @param array $data 创建数据 * @param string $type 创建类型 * @return mixed */private function autoOperation { if(!empty($this->options['auto'])) { $_auto = $this->options['auto']; unset($this->options['auto']); }elseif{ $_auto = $this->_auto; } // 自动填充 if { foreach { // 填充因子定义格式 // array('field','填充内容','填充条件','附加规则',[额外参数]) if $auto[2] = self::MODEL_INSERT; // 默认为新增的时候自动填充 //这里的判断是关键,$type为当前的操作状态,值为1表示是插入,值为2表示是更新 //如果当前的$type状态值等于设置的值$auto[2]或者$auto[2]的值为3,代表需要填充 if( $type == $auto[2] || $auto[2] == self::MODEL_BOTH) { if $auto[3] = 'string'; switch { case 'function': // 使用函数进行填充 字段的值作为参数 case 'callback': // 使用回调方法 $args = isset$auto[4]:array(); if(isset { array_unshift($args,$data[$auto[0]]); } if { $data[$auto[0]] = call_user_func_array; }else{ $data[$auto[0]] = call_user_func_array(array, $args); } break; case 'field': // 用其它字段的值进行填充 $data[$auto[0]] = $data[$auto[1]]; break; case 'ignore': // 为空忽略 if($auto[1]===$data[$auto[0]]) unset; break; case 'string': default: // 默认作为字符串填充 $data[$auto[0]] = $auto[1]; } if(isset && false === $data[$auto[0]] ) unset; } } } return $data;}

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI框架进阶教程》、《Zend
FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。