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 相关文章推荐
实现分十页分向前十页向后十页的处理
Oct 09 PHP
下载文件的点击数回填
Oct 09 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
PHP抽象类 介绍
Jun 13 PHP
解析PHP处理换行符的问题 \r\n
Jun 13 PHP
php上传大文件设置方法
Apr 14 PHP
PHP实现带重试功能的curl连接示例
Jul 28 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
PHP bin2hex()函数基础实例讲解
Feb 11 PHP
laravel 自定义常量的两种方案
Oct 14 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
zend framework多模块多布局配置
2011/02/26 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
JS读取XML文件示例代码
2013/11/15 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
北大自主招生自荐信
2013/10/19 职场文书
自荐信如何“自荐”
2013/10/24 职场文书
运动会广播稿80字
2014/01/23 职场文书
汽车维修求职信
2014/06/15 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js
python操作xlsx格式文件并读取
2021/06/02 Python
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL