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函数解决SQL injection
Oct 09 PHP
PHP中date()日期函数有关参数整理
Jul 19 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
May 05 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
php实现字符串反转输出的方法
Mar 14 PHP
33道php常见面试题及答案
Jul 06 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
Sep 29 PHP
纯php生成随机密码
Oct 30 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
Dec 11 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
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
Symfony核心类概述
2016/03/17 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
python实现月食效果实例代码
2019/06/18 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
Python基于Faker假数据构造库
2020/11/30 Python
python wsgiref源码解析
2021/02/06 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
编辑找工作求职信范文
2013/12/16 职场文书
行政部总经理岗位职责
2014/01/04 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
三八活动策划方案
2014/08/17 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
求职自我评价范文
2015/03/09 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python