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 minixml详解
Jul 19 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
CURL状态码列表(详细)
Jun 27 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
php图片缩放实现方法
Feb 20 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 03 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
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
destoon官方标签大全
2014/06/20 PHP
PHP反射基础知识回顾
2020/09/10 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
JS判断数组那点事
2017/10/10 Javascript
详解利用Angular实现多团队模块化SPA开发框架
2017/11/27 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
车间副主任岗位职责
2013/12/24 职场文书
毕业生找工作的求职信范文
2013/12/24 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
春节超市活动方案
2014/08/14 职场文书
2014年政协工作总结
2014/12/09 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python