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应用提速面面观
Oct 09 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
PHP 身份验证方面的函数
Oct 11 PHP
PHP变量内存分配问题记录整理
Nov 27 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
PHP实现多图片上传类实例
Jul 26 PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
Dec 18 PHP
php实现面包屑导航例子分享
Dec 19 PHP
PHP邮件群发机实现代码
Feb 16 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
Sep 10 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中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
newxtree.js代码
2007/03/13 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
vue项目中使用scss的方法步骤
2019/05/16 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python+django实现文件下载
2016/01/17 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
python实现在线翻译功能
2020/03/03 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
就业协议书
2014/09/12 职场文书
2014年工程部工作总结
2014/11/25 职场文书
小学生班干部竞选稿
2015/11/20 职场文书