手把手写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 }