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 相关文章推荐
基于PHPExcel的常用方法总结
Jun 13 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
PHP反射API示例分享
Oct 08 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 08 PHP
laravel 关联关系遍历数组的例子
Oct 10 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
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
初品cakephp 入门基础
2012/02/16 PHP
学习PHP session的传递方式
2016/06/15 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
Python实现list反转实例汇总
2014/11/11 Python
全面理解Python中self的用法
2016/06/04 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
python如何操作mysql
2020/08/17 Python
python函数超时自动退出的实操方法
2020/12/28 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
文明宿舍获奖感言
2014/02/07 职场文书
员工合理化建议书
2014/05/19 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
ktv好的活动方案
2014/08/17 职场文书
信用卡工资证明格式
2014/09/13 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android