二月飞

学学更健康

手把手写php框架中三大“自动功能”

 

    在很多php框架中都有自动过滤,自动填充,自动验证等三大自动功能,用来对POST表单传过来的数据进行加工,以便能够更加规范的导入数据库。这一功能在添加商品,添加商品分类中有很大的用处。比如thinkphp框架就有自动过滤,自动填充,和自动验证功能。

   今天我们就以MVC的思维方式编写三大自动功能。

 (1) 首先,来写比较简单的自动过滤功能。假如从post表单中传递过来的 数据我么定义为数组$array.即$array=$_POST

 

 1 <?php
 2 
 3 class Model{
 4 
 5       protected $table = NULL; // 是model所控制的表
 6     protected $db = NULL; // 是引入的mysql对象
 7     protected $pk = '';//该表的主键
 8    
 9     protected $fields=array();//用来自动过滤的数组。该数组主要存放model所控制表的所有字段     
10     protected $_auto=array();//用来自动填充的数组。存放post没有但要填充的字段。如添加时间。
11     protected $_valid=array();//用来存放需要验证的字段和相关验证信息
12     protected $error = array();//用来存放错误信息
13 
14      //  当实例化model类时,mysql类同时完成实例化
15      public function __construct() {
16         $this->db = mysql::getIns();
17     }
18 }
19 
20     //完成表单的自动过滤
21   public function  _facade($array=array()){
22    $data=array();  
23    foreach($array as $k=>$v){
24 
25      if(in_array($k,$this->fields)){
26 
27      $data[$k]=$v;
28 }
29 }
30 return $data;
31 
32

(2)完成自动过滤有我们可以得到一个没有违法字段的$data数组。接下来需要完成的是自动填充
public function _autoFill($data){
foreach($this->_auto as $k=>$v){
  if(array_key_exists($v[0],$data){

    switch($v[1]){

     case 'value':
             $data[$v[0]]=$v[2];
             break;
   case 'function':
            $data[$v[0]]=call_user_func($v[2]);
            $break;

                       }

                                           }

                                                 }


return $data; }









 

   (3).也是最难的,也就是完成自动验证。

 首先要写一个验证函数,然后进行自动验证。

 1 //先写一个检测函数
 2 protected function check($value,$rule='',$parm=''){
 3 
 4    switch($rule){
 5      case 'require':
 6          return !empty($value);
 7      case 'number':
 8          return is_numeric($value);
 9      case 'in':
10          return in_array($value,explode(',',$parm);
11      case 'between':
12          list($min,$max)=explode(',',$parm);
13          return $value>=$min&&$value<=$max;
14      case 'length':
15          list($min,$max)=explode(',',$parm);
16          return strlen($value)>=$min&&strlen($value);
17      default:
18          return false;
19    }
20 }

然后我们根据以上的验证函数来对二维数组进行验证。

 1 public function _validate($data){
 2     if(empty($_valid)){
 3        return true;
 4      }
 5    $this->error=array();
 6    foreach($_valid as $k=>$v){
 7      switch($v[1]){
 8        case 1:
 9           if(!isset($v[0])){
10           $this->error=$v[2];
11           return false;
12             }
13          if(!$this->check($v[0],$v[3])){
14              $this->error=$v[2];
15           return false;
16           }
17           break;
18       case 0:
19          if(isset($v[0])){
20       
21           if(!$this->check($v[0],$v[3],$v[4])){
22                     this->error=$v[2];
23                   return false;
24                }
25             }
26           break;
27       case 2:
28           if(isset($v[0]))&& !empty($v[0]){
29            if(!this->check($v[0],$v[3],$v[4])){
30            $this->error=$v[2];
31            return false;
32            }
33           }
34 
35          break;
36      }
37     
38      }
39 
40      return true;
41 }

 

 

 

 

posted on 2013-09-14 20:16  二月飞  阅读(339)  评论(0编辑  收藏  举报

导航