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源码之 ext/mysql扩展部分
Jul 17 PHP
PHP的curl实现get,post和cookie(实例介绍)
Jun 17 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
PHP Cookie学习笔记
Aug 23 PHP
PHP中Trait及其应用详解
Feb 14 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 PHP
django中的ajax组件教程详解
Oct 18 PHP
php常用的工具开发整理
Sep 26 PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 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
简单采集了yahoo的一些数据
2007/02/14 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
基于pip install django失败时的解决方法
2018/06/12 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
对pandas中Series的map函数详解
2018/07/25 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
keras中的backend.clip用法
2020/05/22 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
什么是属性访问器
2015/10/26 面试题
采购文员岗位职责
2013/11/20 职场文书
大学生自我鉴定
2013/12/08 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
廉洁教育学习材料
2014/05/19 职场文书
护士年终个人总结
2015/02/13 职场文书
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
Java完整实现记事本代码
2022/06/16 Java/Android