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 has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
Oct 22 PHP
Look And Say 序列php实现代码
May 22 PHP
php array_filter除去数组中的空字符元素
Jun 21 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
深入解析PHP内存管理之谁动了我的内存
Jun 20 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
smarty学习笔记之常见代码段用法总结
Mar 19 PHP
ThinkPHP中limit()使用方法详解
Apr 19 PHP
PHP加密解密类实例代码
Jul 20 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
php实现的pdo公共类定义与用法示例
Jul 19 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/02 无线电
学习php分页代码实例
2013/10/24 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
javascript简易画板开发
2020/04/12 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
Node.js 基础教程之全局对象
2017/08/06 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
配件采购员岗位职责
2013/12/03 职场文书
餐饮业的创业计划书范文
2013/12/26 职场文书
女娲补天教学反思
2014/02/05 职场文书
应聘会计求职信
2014/06/11 职场文书
财产保全担保书
2015/01/20 职场文书
证婚人致辞精选
2015/07/28 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript