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 15 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
php文件上传的例子及参数详解
Dec 12 PHP
PHP中的类型约束介绍
May 11 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
PHP精确计算功能示例
Nov 29 PHP
cakephp常见知识点汇总
Feb 24 PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php文件上传简单实现方法
2015/01/24 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
vue导入.md文件的步骤(markdown转HTML)
2020/12/31 Vue.js
浅析Python编写函数装饰器
2016/03/18 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
中国跨境电商:Tomtop
2017/03/16 全球购物
学校卫生检查制度
2014/02/03 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
用python修改excel表某一列内容的操作方法
2021/06/11 Python
python实现商品进销存管理系统
2022/05/30 Python