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
如何隐藏你的.php文件
Jan 04 PHP
php的memcached客户端memcached
Jun 14 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
PHP分页类集锦
Nov 18 PHP
PHP使用递归生成文章树
Apr 21 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
PHP实现适用于自定义的验证码类
Jun 15 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
php+js实现百度地图多点标注的方法
Nov 30 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
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
php生成二维码
2015/08/10 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
php 修改密码实现代码
2017/05/24 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
python实现录音小程序
2020/10/26 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
python自动生成model文件过程详解
2019/11/02 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
战友聚会邀请函
2014/01/18 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
学校教师安全责任书
2014/07/23 职场文书
海洋科学专业求职信
2014/08/10 职场文书
大学生自荐信范文
2015/03/05 职场文书
销售开票员岗位职责
2015/04/15 职场文书