php扩展ZF——Validate扩展
程序员文章站
2022-05-25 23:13:28
之前写了一片文章关于如何在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;
}
}
?>
另外你还可以直接扩展一些验证规则类。下篇我再详细说。
在开始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支持页面回退的两种方法