欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php扩展ZF——Validate扩展

程序员文章站 2023-02-17 10:06:41
之前写了一片文章关于如何在zf0.6版本下扩展zf的。这篇应该说是类似的文章,但环境换成zf1.0rc1版本了。      ...
之前写了一片文章关于如何在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; 
    } 

?> 


   另外你还可以直接扩展一些验证规则类。下篇我再详细说。