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 相关文章推荐
解决控件遮挡问题:关于有窗口元素和无窗口元素
Jan 28 PHP
PHP 命令行参数详解及应用
May 18 PHP
xml在joomla表单中的应用详解分享
Jul 19 PHP
自己写的php中文截取函数mb_strlen和mb_substr
Feb 09 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
详谈PHP编码转换问题
Jul 28 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
thinkphp5实现无限级分类
Feb 18 PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 PHP
php命令行模式代码实例详解
Feb 26 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
php跨域调用json的例子
2013/11/13 Javascript
javascript常见用法总结
2014/05/22 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Python3 操作符重载方法示例
2017/11/23 Python
使用tensorflow实现线性svm
2018/09/07 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
关于Java String的一道面试题
2013/09/29 面试题
《老王》教学反思
2014/02/23 职场文书
课程改革实施方案
2014/03/16 职场文书
安全承诺书范文
2014/03/26 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
销售目标责任书
2014/07/23 职场文书
观后感格式
2015/06/19 职场文书
运输公司工作总结
2015/08/11 职场文书