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如何得到当前页和上一页的地址?
Nov 27 PHP
php 无限级 SelectTree 类
May 19 PHP
php Memcache 中实现消息队列
Nov 24 PHP
PHP下对字符串的递增运算代码
Aug 21 PHP
初识PHP
Sep 28 PHP
php目录拷贝实现方法
Jul 10 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
php-fpm添加service服务的例子
Apr 27 PHP
Laravel 创建指定表 migrate的例子
Oct 09 PHP
PHP实现简单的协程任务调度demo示例
Feb 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
jquery中动态效果小结
2010/12/16 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python实现单词拼写检查
2015/04/25 Python
Python开发的HTTP库requests详解
2017/08/29 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
详解python里的命名规范
2018/07/16 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
如何基于Python实现自动扫雷
2020/01/06 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
幼儿园教师考核制度
2014/02/01 职场文书
英语国培研修感言
2014/02/13 职场文书
党的群众路线调研报告
2014/11/03 职场文书
初中成绩单评语
2014/12/29 职场文书
检讨书模板大全
2015/05/07 职场文书
寒假生活随笔
2015/08/15 职场文书
小学大队委竞选口号
2015/12/25 职场文书