手把手写php框架中三大“自动功能”
在很多php框架中都有自动过滤,自动填充,自动验证等三大自动功能,用来对POST表单传过来的数据进行加工,以便能够更加规范的导入数据库。这一功能在添加商品,添加商品分类中有很大的用处。比如thinkphp框架就有自动过滤,自动填充,和自动验证功能。
今天我们就以MVC的思维方式编写三大自动功能。
(1) 首先,来写比较简单的自动过滤功能。假如从post表单中传递过来的 数据我么定义为数组$array.即$array=$_POST
<?php class Model{ protected $table = NULL; // 是model所控制的表
protected $db = NULL; // 是引入的mysql对象
protected $pk = '';//该表的主键 protected $fields=array();//用来自动过滤的数组。该数组主要存放model所控制表的所有字段
protected $_auto=array();//用来自动填充的数组。存放post没有但要填充的字段。如添加时间。
protected $_valid=array();//用来存放需要验证的字段和相关验证信息
protected $error = array();//用来存放错误信息 // 当实例化model类时,mysql类同时完成实例化
public function __construct() {
$this->db = mysql::getIns();
}
} //完成表单的自动过滤
public function _facade($array=array()){
$data=array();
foreach($array as $k=>$v){ if(in_array($k,$this->fields)){ $data[$k]=$v;
}
}
return $data; } (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).也是最难的,也就是完成自动验证。
首先要写一个验证函数,然后进行自动验证。
//先写一个检测函数
protected function check($value,$rule='',$parm=''){ switch($rule){
case 'require':
return !empty($value);
case 'number':
return is_numeric($value);
case 'in':
return in_array($value,explode(',',$parm);
case 'between':
list($min,$max)=explode(',',$parm);
return $value>=$min&&$value<=$max;
case 'length':
list($min,$max)=explode(',',$parm);
return strlen($value)>=$min&&strlen($value);
default:
return false;
}
}
然后我们根据以上的验证函数来对二维数组进行验证。
public function _validate($data){
if(empty($_valid)){
return true;
}
$this->error=array();
foreach($_valid as $k=>$v){
switch($v[1]){
case 1:
if(!isset($v[0])){
$this->error=$v[2];
return false;
}
if(!$this->check($v[0],$v[3])){
$this->error=$v[2];
return false;
}
break;
case 0:
if(isset($v[0])){ if(!$this->check($v[0],$v[3],$v[4])){
this->error=$v[2];
return false;
}
}
break;
case 2:
if(isset($v[0]))&& !empty($v[0]){
if(!this->check($v[0],$v[3],$v[4])){
$this->error=$v[2];
return false;
}
} break;
} } return true;
}
手把手写php框架中三大“自动功能”的更多相关文章
- Android开发之手把手教你写ButterKnife框架(三)
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...
- Android开发之手把手教你写ButterKnife框架(二)
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开 ...
- CSS面试复习(三):预处理器、工程化方案、三大框架中的CSS
一.预处理器 1.介绍 基于CSS的另一种语言.通过工具编译成CSS.添加了很多CSS不具备的特性.能提升CSS文件的组织 2.less嵌套 3 .sass嵌套 4. less变量 5.sass变量 ...
- Angular Vue React 框架中的 CSS
框架中的 CSS Angular Vue React 三大框架 Angular Vue 内置样式集成 React 一些业界实践 Angular Angular . js (1.x):没有样式集成能力 ...
- 漫谈 GOF 设计模式在 Spring 框架中的实现
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 漫谈 GOF 设计模式在 Spring ...
- 要想精通Mybatis?从手写Mybatis框架开始吧!
1.Mybatis组成 动态SQL Config配置 Mapper配置 2.核心源码分析 Configuration源码解析 SqlSessionFactory源码解析 SqlSession源码解析 ...
- 手把手撸套框架-Victory框架1.1 详解
目录 上一篇博客 Victory框架1.0 详解 有说道,1.0的使用过程中出现不少缺点,比如菜单不能折叠,权限没有权限组等等. 所以,我还是抽出时间在下班后,回到我的小黑屋里 完成了1.1的升级. ...
- 制作类似ThinkPHP框架中的PATHINFO模式功能
一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...
- 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制
推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...
随机推荐
- Eclipse编程时的快捷键总结
" alt + / " 快捷键是代码补全功能 输入" syso alt + / "会自动补全成System.out.println();
- 珍惜每一滴水(kbmmw 中的内存调试)
作为一个服务器端的应用,最基本的要求就是稳定,当然要做一个稳定的服务器端,需要涉及到很多方面, 内存泄露就是稳定的一个致命杀手,因为服务器的物理内存是有限的,即使一个功能有很小的内存泄露,经过 长时间 ...
- mobx源码解读3
计算属性 function Todo() { this.id = Math.random() mobx.extendObservable(this, { aaa: 222, bbb: 11, ccc: ...
- VC++ 最小化到托盘、恢复
所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分.在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区. 一.托盘编程相关函数 ...
- 删除win7远程桌面历史记录
开始-运行-“regedit”注册表中找到HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default 删除不需要的即可
- 发邮件 和 excel导出中文文件名
/** * 发邮件 * @param email * @param subject * @param body * @throws UnsupportedEncodingException */ pu ...
- windbg学习----.process
.process 命令指定要用作进程上下文的进程(Set Process Context) .process显示当前进程的EPROCESS,这里显示当前进程为test.exe kd> .proc ...
- php+MySQL+Ajax
点赞功能原理. 图片. 1.connect.php文件 <?php $host="localhost"; $db_user="root"; $db ...
- machine leanring 笔记 vectorization
the summation of the product of two terms can be expressed as the product of two vectors ps. surf ...
- machine learning 笔记 normal equation
theta=(Xt*X)^-1 Xt*y x is feature matrix y is expectation