手把手写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皆是十分优秀的框架,各有特 ...
随机推荐
- css左右居中的几种常见方法
本人是前端的新人,这是第一次写技术博客,各位大大,本文有错误请指正,手中的板砖尽量轻拍,我怕疼~~ 对于水平居中和垂直居中我也用过很多方法,但是有的时候管用有的时候又嗝屁不好使了.涉及到的情况很多,所 ...
- 那些年,我们一起追的面试题。。to be continued!!!
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被 ...
- AIX 环境下整理文件系统碎块
IBM AIX v5.3以上版本操作系统环境下基本上不需要对文件系统碎块进行整理,查到AIX里有整理文件系统碎块命令,这里简单提一下. 命令:defragfs例:#defragfs /var defr ...
- TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- 在线api地址
J2SE1.7英文api地址: http://download.oracle.com/javase/7/docs/api/J2SE1.6英文api地址: http://download.oracle ...
- go语言的selector
For a primary expression x that is not a package name, the selector expression x.f denotes the field ...
- JAVA反射实践
Java反射机制在我的理解当中就是下面几点: 1. 对一个给定的类名(以字符串形式提供)能动态构建一个对象实例 2. 对于任意一个类,都能够知道这个类的所有属性和方法 3. 对于任意一个对象, ...
- bootstrap--小李子demo
最近忙啊...看到各位冬鞋都在认真写博客,认真敲代码,认真工作,总觉得自己时间太少,总觉得时间不够,老了...... 进正题: 上次不知从哪里(忘了)下载了bootstrap的一些使用小demo,以后 ...
- eclipse安装svn和maven插件以及m2e-extras
相关介绍: 1.SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Su ...
- Dev WPF使用总结
1.换肤 ThemeManager.ApplicationThemeName = Theme.DXStyle.Name this.UpdateLayout(); //重新布局