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 $_SERVER详解
Jan 16 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
phpmail类发送邮件函数代码
Feb 20 PHP
PHP中执行cmd命令的方法
Oct 11 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
Dec 05 PHP
php比较相似字符串的方法
Jun 05 PHP
phalcon框架使用指南
Feb 23 PHP
Symfony2联合查询实现方法
Mar 18 PHP
PHP微信开发之查询城市天气
Jun 23 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
Oct 11 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
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
python 重命名轴索引的方法
2018/11/10 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
Django权限设置及验证方式
2020/05/13 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
经销商培训邀请函
2014/01/21 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
成绩报告单家长评语
2014/12/30 职场文书
介绍信范文大全
2015/05/07 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang