手把手写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皆是十分优秀的框架,各有特 ...
随机推荐
- Android 打包
1.数字签名(指的是我们打包程序时所用keystore的SHA1指纹) 2.debug打包,不能在android 市场上架,使用的签名是默认的签名,1年后失效:release打包使用的是自己的签名,可 ...
- Processing简明教程与Java平台移植方法
1 Processing 1.1 Processing简介 Processing是一种具有革命前瞻性的新兴计算机语言,它的概念是在电子艺术的环境下介绍程序语言,并将电子艺术的概 ...
- [JS]Ext最新GPL版
https://www.sencha.com/legal/gpl/ Sencha Ext JS.Sencha Touch.Sencha GXT http://cdn.sencha.com/ext/gp ...
- Python自动化 【第十五篇】:CSS、JavaScript 和 Dom介绍
本节内容 CSS javascript dom CSS position标签 fixed: 固定在页面的某个位置 relative + absolute: 相对定位 opacity:0.5 设置透明度 ...
- Modified Least Square Method and Ransan Method to Fit Circle from Data
In OpenCv, it only provide the function fitEllipse to fit Ellipse, but doesn't provide function to f ...
- MySQL效能监控工具mysqlreport安装和中文说明
管理 mysql 最让人困扰的就是如何有效的掌握 MySQL 的健康状况,因为 MySQL 虽然有提供许多系统变量值供您参考,但这些零散的数据若要手动搜集与过滤将会是一件十分没有效率的事情(除非您写 ...
- MarkDown初体验
初体验 写在前面 一周前第一次听说了MarkDown这个编辑器,通过它知道了LaTex,正好满足了我多年对网上博客里的公式简陋的表达的需求.起初,只是用到了LaTex公式这一个功能 , 对于主要文字的 ...
- winform开发之UI系列
1.如何构造一个漂亮的主窗体 主要讲述如何对一个新建窗体的美化过程,涉及到经常需要用到的几个属性我会着重强调它的用法,并不断更新它,因为楼主也正在探索中.... 步骤如下: vs新建一个winform ...
- Zepto API 学习
1. after, before, append, prepend 的区别 A.after(B) ==== B.insertAfter(A) // B 放在 A 的后面 A.before(B) == ...
- sql server之数据库语句优化
三.只返回需要的数据 返回数据到客户端至少需要数据库提取数据.网络传输数据.客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器.网络和客户端的无效劳动,其害处是显而易见的,避 ...