php扩展ZF――Validate扩展


Posted in PHP onJanuary 10, 2008

之前写了一片文章关于如何在ZF0.6版本下扩展ZF的。这篇应该说是类似的文章,但环境换成ZF1.0RC1版本了。

     在开始ZF扩展之前,推荐先看看ZF手册中的一些命令规范(ZF推荐使用),同时希望读者对ZF有较好的理解。如果没有,可以先上PHPCHIAN的ZF版本详细了解,或者到phpeye查找相关资料。

      ZF的validator提供了强大的验证功能,但在实际的操作中还是过于烦琐。比如说验证邮件,是用ZF的代码如下

<?php 

require_once 'Zend/Validate/EmailAddress.php'; 
$validator = new Zend_Validate_EmailAddress(); 
if ($validator->isValid($email)) { 
    // email appears to be valid 
} else { 
    // email is invalid; print the reasons 
    foreach ($validator->getMessages() as $message) { 
        echo "$message\n"; 
    } 

?> 

    有没有发现,还是很类似我们不使用ZF的验证方式。只不过ZF帮我们把邮件验证的细节封装好了。那么我们如何简化成这样效果呢?(下面是我扩展后的调用方式)

<?php 
$validate = new Phpbean_Validate(); 
        $validate -> set_breakOnFailure(false); 
        $validate -> add('email',new Zend_Validate_EmailAddress(),'邮件地址不正确!'); 
        $validate -> add('username',new Zend_Validate_StringLength(3,15),'用户名长度必须在3到15之间!\'%value%\'不满足条件'); 
        $validate -> add('password',new Zend_Validate_StringLength(6,20),'密码长度必须在6到20之间!'); 
        $validate -> add('password',new Phpbean_Validate_isEqual($_POST['repassword']),'两次输入密码不匹配'); 
        $authcode = new Phpbean_Img_Code(); 
        $validate -> add('yanxue8_authcode',new Phpbean_Validate_isEqual($authcode->authcode($_POST['yanxue8_authcode_mdcode'],'DECODE')),'验证码不匹配!'); 
        if( !$validate -> validator($_POST) ){ 
            error_page('注册失败',$validate->getMessageText()); 
        } 
?> 

    用上面这种方式一方面代码清晰,另一方面也有利同意的出错处理。那么如何做到这样呢?
    关键是Phpbean_Validate这个类。
    其实实现起来很简单,Phpbean_Validate::add()方法是把一条条的验证规则加入进来。然后调用Phpbean_Validate::validator()来验证就OK了。
    具体实现步骤如下:
    首先,在zend的同级目录中增加一个phpbean文件夹,然后在里面增加一个Validator.php文件。
    然后,在validator.php文件加入Phpbean_Validate这个类的定义。注意(你可以修改成自己的文件名和路径名,但注意一定要和类的名称保持一致)。
    这里,我给出我的Phpbean_Validate类的实现过程,仅供参考。

<? 
class Phpbean_Validate{ 

    protected $_fileds =array(); 

    protected $_message = array(); 

    protected $_breakOnFailure = true; 

    public function set_breakOnFailure($value){ 
        $this->_breakOnFailure = $value; 
    } 

    public function add($key,$validate,$message='',$breakOnFailure=''){ 
        if( empty($breakOnFailure) ) $breakOnFailure = $this->_breakOnFailure;  
        $this->_fileds[] = array($key,$validate,$message,$breakOnFailure); 
        return $this; 
    } 

    public function validator($array = array()){ 
        if(empty($array)) $array = $_POST; 
        if (is_array($this->_fileds)) { 
            foreach ($this->_fileds as $filed){ 
                list($key,$validate,$message,$breakOnFailure) = $filed; 

                if(empty($key)){ 
                    if(!$validate){ 
                        $this->_message[][] = $message; 
                        if($breakOnFailure) break;  
                    } 
                    continue; 
                } 

                if(!empty($message)) $validate->setMessage($message); 
                if( !$validate->isValid($array[$key]) ){ 
                    $this->_message[$key][] = $validate->getMessages(); 
                    if($breakOnFailure) break;  
                } 
            } 
            if(!empty($this->_message))return false; 
            return true; 
        } 
        return true; 
    } 

    public function getMessage(){ 
        return $this->_message; 
    } 
    public function getMessageText(){ 
        $str = ''; 
        foreach ($this->_message as $ms){ 
            foreach ($ms as $m) $str .= $m[0]."\n"; 
        } 
        return $str; 
    } 

?> 

   另外你还可以直接扩展一些验证规则类。下篇我再详细说。 

PHP 相关文章推荐
php 保留小数点
Apr 21 PHP
php 文件夹删除、php清除缓存程序
Aug 25 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
11个PHP 分页脚本推荐
Aug 15 PHP
第四章 php数学运算
Dec 30 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
phpExcel中文帮助手册之常用功能指南
Aug 18 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
Dec 15 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 05 PHP
set_include_path在win和linux下的区别
Jan 10 #PHP
php模板之Phpbean的目录结构
Jan 10 #PHP
Phpbean路由转发的php代码
Jan 10 #PHP
php框架Phpbean说明
Jan 10 #PHP
深入解析php模板技术原理【一】
Jan 10 #PHP
php下MYSQL limit的优化
Jan 10 #PHP
优化使用mysql存储session的php代码
Jan 10 #PHP
You might like
PHP控制网页过期时间的代码
2008/09/28 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
[IE&amp;FireFox兼容]JS对select操作
2007/01/07 Javascript
js类中获取外部函数名的方法
2007/08/19 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
Python中正则表达式的详细教程
2015/04/30 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
java程序员面试交流
2012/11/29 面试题
幼儿园消防安全制度
2014/01/26 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
Python列表的索引与切片
2022/04/07 Python