Zend Framework2 表单过滤、表单验证示例

来源:互联网 发布:淘宝网聚划算推广 编辑:程序博客网 时间:2024/05/17 22:37
表单数据存储到数据库之前的要求是:

    用户名:过滤左右空格,字符都转换为小写,只能是由数字和字母字符组成,长度限制,数据库必须不存在该用户名。

    密码:密码1和密码2必须相同,长度限制。

    邮箱:必须符合密码格式,加密存储,长度限制。

    手机:必须是11位数字字符组成,加密存储。

    内容:将敏感词”SB“替换为”**“,内容尾部添加字符串”------Hello World !“。

    首先,Form的构造函数添加基本的html标签元素:

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. class TestForm extends Form  implements InputFilterProviderInterface{  
  2.       
  3.     protected $adapter;  
  4.     protected $inputFilter;   
  5.       
  6.     public function __construct($adap) {  
  7.   
  8.         parent::__construct('test');  
  9.           
  10.         $this->adapter = $adap;//由于该检验“数据库必须不存在该用户名”会用到“Zend\Validator\Db\RecordExists”,该validator需要数据库adpater初始化,因此,构造函数必须接收一个adapter参数  
  11.   
  12.         $this->add(array(  
  13.             'name' => 'userName',  
  14.             'type' => 'Text',  
  15.             'options' => array(  
  16.                 'label' => '用户名:',                  
  17.             ),  
  18.             'attributes' => array(  
  19.                 'size' => 60,  
  20.                 'maxlength' => 100,  
  21.             ),  
  22.         ));  
  23.         $this->add(array(  
  24.             'name' => 'password1',  
  25.             'type' => 'Password',  
  26.             'options' => array(  
  27.                 'label' => '密码:',                  
  28.             ),  
  29.             'attributes' => array(  
  30.                 'size' => 60,  
  31.                 'maxlength' => 100,  
  32.             ),  
  33.         ));  
  34.         $this->add(array(  
  35.             'name' => 'password2',  
  36.             'type' => 'Password',  
  37.             'options' => array(  
  38.                 'label' => '再次输入密码:',                  
  39.             ),  
  40.             'attributes' => array(  
  41.                 'size' => 60,  
  42.                 'maxlength' => 100,  
  43.             ),  
  44.         ));  
  45.         $this->add(array(  
  46.             'name' => 'email',  
  47.             'type' => 'Text',  
  48.             'options' => array(  
  49.                 'label' => '邮箱:',                  
  50.             ),  
  51.             'attributes' => array(  
  52.                 'size' => 60,  
  53.                 'maxlength' => 100,  
  54.             ),  
  55.         ));  
  56.         $this->add(array(  
  57.             'name' => 'mobile',  
  58.             'type' => 'Text',  
  59.             'options' => array(  
  60.                 'label' => '手机:',                  
  61.             ),  
  62.             'attributes' => array(  
  63.                 'size' => 60,  
  64.                 'maxlength' => 100,  
  65.             ),  
  66.         ));  
  67.         $this->add(array(  
  68.             'name' => 'ifenc',  
  69.             'type' => 'Radio',  
  70.             'options' => array(  
  71.                 'label' => '是否加密:',      
  72.                 'value_options' => array(  
  73.                     'yes' => '是',  
  74.                     'no' => '否',  
  75.                 )  
  76.             ),  
  77.         ));  
  78.         $this->add(array(  
  79.             'name' => 'content',  
  80.             'type' => 'Textarea',  
  81.             'options' => array(  
  82.                 'label' => '内容:',                  
  83.             ),  
  84.             'attributes' => array(  
  85.                 'cols' => 80,  
  86.                 'rows' => 6,  
  87.             ),  
  88.         ));  
  89.         $this->add(new Csrf('security'));//这个element阻止跨站点伪造请求攻击  
  90.         $this->add(array(  
  91.             'name' => 'send',  
  92.             'type' => 'Submit',  
  93.             'attributes' => array(  
  94.                 'value' => '确定',  
  95.             ),  
  96.         ));  
  97.     }  
  98. }  

    然后为该Form的各个元素添加filter和validator:

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. class TestForm extends Form  implements InputFilterProviderInterface{  
  2.   
  3.     public function getInputFilterSpecification() {  
  4.         return array(  
  5.             'userName' => array(  
  6.                 'required' => true,  
  7.                 'filters'  => array(  
  8.                     array('name' => 'StringTrim'),//去除前后空格  
  9.                     array('name' => 'StringToLower'),//转为小写字符  
  10.                 ),  
  11.                 'validators' => array(  
  12.                     array('name' => 'NotEmpty'),//不允许为空  
  13.                     array('name' => 'Alnum'),//注意,Zend\I18n\Validator\Alnum要求打开intl的php扩展,具体做法是,打开php.ini文件,将“extension=php_intl.dll”前面的“;”删除,然后重启web服务即可。  
  14.                     array(  
  15.                         'name'    => 'StringLength',//限制长度  
  16.                         'options' => array(  
  17.                             'encoding' => 'UTF-8',  
  18.                             'min'      => 3,  
  19.                             'max'      => 256,  
  20.                         ),  
  21.                     ),  
  22.                     array(  
  23.                         'name'    => 'Db\NoRecordExists',//不允许数据库已存在该用户名,说明,数据库中有表user,user表有字段name就是存储的用户名,因此,该validator就是检验user表的name字段  
  24.                         'options' => array(  
  25.                             'table' => 'user',  
  26.                             'field' => 'name',  
  27.                             'adapter' => $this->adapter,  
  28.                         ),  
  29.                     ),  
  30.                 ),  
  31.             ),  
  32.             'password1' => array(  
  33.                 'required' => true,  
  34.                 'validators' => array(  
  35.                     array(  
  36.                         'name'    => 'StringLength',//限制长度  
  37.                         'options' => array(  
  38.                             'encoding' => 'UTF-8',  
  39.                             'min'      => 6,  
  40.                             'max'      => 6,  
  41.                         ),  
  42.                     ),  
  43.                 ),  
  44.             ),  
  45.             'password2' => array(  
  46.                 'required' => true,  
  47.                 'validators' => array(  
  48.                     array(  
  49.                         'name'    => 'StringLength',//限制长度  
  50.                         'options' => array(  
  51.                             'encoding' => 'UTF-8',  
  52.                             'min'      => 6,  
  53.                             'max'      => 6,  
  54.                         ),  
  55.                     ),  
  56.                     array(  
  57.                         'name'    => 'Identical',//检验是否和password1相同,Zend\Validator\Identical可以用于检验另一个元素和自己是否相同  
  58.                         'options' => array(  
  59.                             'token' => 'password1',  
  60.                         ),  
  61.                     ),  
  62.                 ),  
  63.             ),  
  64.             'email' => array(  
  65.                 'required' => true,  
  66.                 'validators' => array(  
  67.                     array(  
  68.                         'name'    => 'StringLength',//限制长度  
  69.                         'options' => array(  
  70.                             'encoding' => 'UTF-8',  
  71.                             'min'      => 3,  
  72.                             'max'      => 256,  
  73.                         ),  
  74.                     ),  
  75.                     array('name'    => 'EmailAddress'),//检验邮箱格式,Zend\Validator\Identical\EmailAddress专门用于检验邮箱格式  
  76.                 ),  
  77.             ),  
  78.             'mobile' => array(  
  79.                 'required' => true,  
  80.                 'validators' => array(  
  81.                     array(  
  82.                         'name'    => 'StringLength',//限制长度  
  83.                         'options' => array(  
  84.                             'encoding' => 'UTF-8',  
  85.                             'min'      => 11,  
  86.                             'max'      => 11,  
  87.                         ),  
  88.                     ),  
  89.                     array('name'    => 'Digits')//必须为数字字符  
  90.                 ),  
  91.             ),  
  92.             'ifenc' => array(  
  93.                 'required' => true,  
  94.   
  95.             ),  
  96.             'content' => array(  
  97.                 'required' => true,  
  98.                 'filters'  => array(  
  99.                     array(  
  100.                         'name'    => 'PregReplace',//替换敏感词  
  101.                         'options' => array(  
  102.                             'pattern' => '/SB/',  
  103.                             'replacement' => '**'  
  104.                         ),  
  105.                     ),  
  106.                     array(  
  107.                         'name'    => '\Zend\Filter\Callback',//加尾巴的自定义filter回调  
  108.                         'options' => array(  
  109.                             'callback' => array('Test\Form\MyAddTailFilter''addTail')//MyAddTailFilter是自定义的一个filter回调  
  110.                         ),  
  111.                     ),  
  112.                 ),  
  113.                 'validators' => array(  
  114.                     array('name' => 'NotEmpty'),//不允许为空  
  115.                     array(  
  116.                         'name'    => 'StringLength',//限制长度  
  117.                         'options' => array(  
  118.                             'encoding' => 'UTF-8',  
  119.                             'min'      => 1,  
  120.                             'max'      => 1024,  
  121.                         ),  
  122.                     ),                      
  123.                 ),  
  124.             ),   
  125.         );  
  126.     }  
  127. }  

    其中,为content添加尾巴的filter回调类MyAddTailFilter代码如下:

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. namespace Test\Form;  
  2.   
  3. class MyAddTailFilter {  
  4.     public function addTail($param){  
  5.         $ret = $param."----hello world !";  
  6.         return $ret;  
  7.     }  
  8. }  

    控制器:

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. use Zend\Filter\Encrypt;  
  2. use Zend\Filter\Decrypt;  
  3. use Test\Form\TestForm;  
  4. use Test\Form\MyValidatorTranslator;  
  5.   
  6. class TestController extends AbstractActionController {  
  7.   
  8.     public function testformAction() {  
  9.              
  10.         $form = new TestForm($this->getServiceLocator()->get('Zend\Db\Adapter\Adapter'));//为检验是否用户名已存在的validator提供数据库adapter  
  11.         $request = $this->getRequest();  
  12.         if ($request->isPost()) {  
  13.             $form->setData($request->getPost());           
  14.             if ($form->isValid()) {                  
  15.                 $filteredValues = $form->getInputFilter()->getValues();//检验成功后,获取过滤后的数据  
  16.   
  17.         //将email和手机号码加密                  
  18.                 $encKey = '123456';  
  19.                 $enc = new Encrypt(array('adapter' => 'BlockCipher'));//创建加密filter  
  20.                 $enc->setKey($encKey);//设置key  
  21.                 $enc->setVector('12345678901234567890');//加盐  
  22.                 //加密email  
  23.                 $filteredValues['email'] = $enc->filter($filteredValues['email']);  
  24.         //加密手机号  
  25.                 $filteredValues['mobile'] = $enc->filter($filteredValues['mobile']);  
  26.                   
  27.         //解密                  
  28.                 //$dec = new Decrypt(array('adapter' => 'BlockCipher'));  
  29.                 //$dec->setKey($encKey);//设置key  
  30.                 //$filteredValues['email'] = $dec->filter($filteredValues['email']);  
  31.                 //$filteredValues['mobile'] = $dec->filter($filteredValues['mobile']);  
  32.   
  33.         //将$filteredValues保存到数据库  
  34.         //......  
  35.             }  
  36.         }  
  37.   
  38.         return array(  
  39.             'tform' => $form,  
  40.         );  
  41.      }  
  42. }  

    testform.phtml

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $this->tform->setAttribute('action'$this->url('test'array('action' => 'testform')));  
  2. $this->tform->setAttribute('method''POST');  
  3. $this->tform->prepare();  
  4.   
  5. echo "<div class='tf'>";  
  6. echo '<div>'.$this->form()->openTag($this->tform).'</div>';  
  7. //$um = $this->tform->get('userName');  
  8. //echo '<div>'.$this->formLabel($um).$this->formText($um).$this->formElementErrors($um).'</div>';  
  9. echo '<div>'.$this->formRow($this->tform->get('userName')).'</div>';  
  10. echo '<div>'.$this->formRow($this->tform->get('password1')).'</div>';  
  11. echo '<div>'.$this->formRow($this->tform->get('password2')).'</div>';  
  12. echo '<div>'.$this->formRow($this->tform->get('email')).'</div>';  
  13. echo '<div>'.$this->formRow($this->tform->get('mobile')).'</div>';  
  14. $yn = $this->tform->get('ifenc');  
  15. echo "<div>".$this->formLabel($yn).$this->formRadio($yn).$this->formElementErrors($yn).'</div>';//对Radio标签,直接用$this->formRow显示的效果很难看,因此,先formLabel,在formRadio,最后显示检验失败原因的消息formElementErrors  
  16. //echo '<div>'.$this->formRow($this->tform->get('ifenc')).'</div>';  
  17. echo '<div>'.$this->formRow($this->tform->get('content')).'</div>';  
  18. echo '<div>'.$this->formHidden($this->tform->get('security')).'</div>';  
  19. echo '<div>'.$this->formRow($this->tform->get('send')).'</div>';  
  20. echo '<div>'.$this->form()->closeTag().'</div>';  
  21. echo "</div>";  

    至此,已经完成了将表单保存到数据库之前的,对表单数据进行过滤和检验的工作!


    以下是zf2中的一些标准filter和validator:


zf2的一些标准filter类:
Zend\Filter\StringToLower:字符串转小写。
Zend\Filter\StringToUpper:字符串转大写。
Zend\Filter\StringTrim:过滤掉字符串前后“空白字符”和指定字符。
Zend\Filter\StripNewlines:过滤掉字符串中的\r\n等新行符。
Zend\Filter\StripTags:过滤掉字符串中的xml和html标签,接受不过滤的标签和标签属性参数。
Zend\Filter\Word\CamelCaseToUnderscore:首字符大写分隔字符串转“_”分隔字符串。
Zend\Filter\Word\UnderscoreToCamelCase:“_”分隔字符串转首字符大写分隔字符串。
Zend\Filter\Word\UnderscoreToSeparator:“_”分隔字符串转“ ”或指定分隔符分隔字符串。
Zend\Filter\Word\UnderscoreToDash:“_”分隔字符串转“-”分隔字符串。
Zend\Filter\Word\CamelCaseToDash:首字符大写分隔字符串转“-”分隔字符串。
Zend\Filter\Word\DashToCamelCase:“-”分隔字符串转首字符大写分隔字符串。
Zend\Filter\Word\DashToSeparator:“-”分隔字符串转“ ”或者指定分隔符分隔字符串。
Zend\Filter\Word\DashToUnderscore:“-”分隔字符串转“_”分隔字符串。
Zend\Filter\Word\CamelCaseToSeparator:首字符大写分隔字符串转“ ”或者指定分隔符分隔字符串。
Zend\Filter\Word\SeparatorToCamelCase:“ ”或者指定分隔符分隔字符串转首字符大写分隔字符串。
Zend\Filter\Word\SeparatorToDash:“ ”或者指定分隔符分隔字符串转“-”分隔字符串。
Zend\Filter\Word\SeparatorToSeparator:“ ”或者指定分隔符分隔字符串转“-”或指定分隔符分隔字符串。
Zend\Filter\HtmlEntities:转换字符串中的'&'、'"'、“<”等特殊字符。
Zend\I18n\Filter\Alnum:过滤字符串中非字母字符和数字字符,可选保留空格。
Zend\I18n\Filter\Alpha:过滤字符串中非字母字符,可选保留空格。
Zend\Filter\Digits:过滤字符串中非数字字符。
Zend\Filter\Boolean:将"yes","no","true","false","1","0",1,0等字符串或者数字转为布尔值true,false。
Zend\Filter\Int:字符串转整数,例如“-5 abcded”,过滤后为-5。
Zend\Filter\Null:如果empty(字符串)是true,则过滤后为NULL。
Zend\I18n\Filter\NumberFormat:格式化数字,例如$filter = new NumberFormat("en_US", NumberFormatter::PERCENT);$filter->filter(0.80);返回“80%”。
Zend\Filter\PregReplace:使用正则表达式查找字符串并用给定字符串替换。
Zend\Filter\Callback:让filter回调开发者自定义函数(可以是类的成员函数或者php53以上版本的魔术方法__invoke)过滤input。
Zend\Filter\BaseName:对文件路径字符串过滤掉文件夹字符串,返回文件名,例如“/etc/t.t”和“c:\t\t.t”返回“t.t”。
Zend\Filter\Dir:对文件路径字符串过滤掉文件名,返回文件夹字符串,例如“/etc/t.t”和“c:\t\t.t”返回“/etc”和“c:\t”。
Zend\Filter\RealPath:返回真实目录,目录要存在,接收是否创建目录的参数,例如“/etc/a/b/c/../../../”,过滤后返回“/etc”。
Zend\Filter\UriNormalize:完善uri,例如$filter = new UriNormalize(array('enforcedScheme' => 'https'));$filter->filter('www.z.cn');返回“https://www.z.cn”。
Zend\Filter\File\Rename:重命名或者移动文件。
Zend\Filter\File\RenameUpload:重命名或者移动上传文件到一个新目录。可以设置文件名为随机名称、原名或指定名,是否保留扩展名。建议任何时候都不要使用原名。
Zend\Filter\Compress:压缩字符串、文件或目录,支持的格式有bz2、gz、lzf、rar、tar、zip。注意,lzf只支持字符串压缩,rar、tar只支持文件和目录压缩。
Zend\Filter\Decompress:解压缩字符串、文件或目录,支持的格式同Zend\Filter\Compress。
Zend\Filter\Encrypt:加密字符串(有“BlockCipher”和“OpenSSL”2个adapter可选,BlockCipher使用的是Mcrypt扩展)。
Zend\Filter\Decrypt:解密字符串。
Zend\Filter\Inflector:可用于过滤、格式化分割的字符串,可为分割字符串不同部分设置不同的filters。

zf2的一些标准validator类:
Zend\Validator\StringLength:限制字符串长度范围,可选编码方式。
Zend\I18n\Validator\Alnum:检验字符串是否由字母字符和数字字符组成,可选允许空格。
Zend\I18n\Validator\Alpha:检验字符串是否由字母字符组成,可选允许空格。
Zend\Validator\Hex:检验字符串是否是16进制字符(‘0’~‘9’、‘A~‘F’)组成。
Zend\Validator\Digits:检验输入是否是数字(包括数值型输入)。
Zend\I18n\Validator\Int:检验整数。
Zend\I18n\Validator\Float:检验输入是否包含一个浮点数。
Zend\Validator\Between:检查数字是否在给定范围内,可选包括边界值。
Zend\Validator\LessThan:检查数字是否大小于给定值,可选等于给定值。
Zend\Validator\GreaterThan:检查数字是否大于给定值,可选等于给定值。
Zend\Validator\NotEmpty:检验输入是否非空。
Zend\Validator\EmailAddress:检验输入是否是有效email地址。
Zend\Validator\Regex:检验字符串是否和指定正则表达式匹配。
Zend\Validator\Identical:检查输入是否和给定项相同。
Zend\Validator\Callback:让validator回调开发者自定义函数(可以是类的成员函数或者php53以上版本的魔术方法__invoke)检验input。
Zend\Validator\Date:检验输入是否包含一个日期,默认格式yyyy-MM-dd,也可自定义格式。
Zend\Validator\Db\RecordExists:检查输入是否在数据库某个表某个字段存在。
Zend\Validator\Db\NoRecordExists:检查输入是否在数据库某个表某个字段不存在,可用于检查用户名是否已注册等。
Zend\Validator\InArray:检验输入是否包含在数组中。
Zend\Validator\Hostname:检验DNS域名、ip地址、localhost。
Zend\Validator\Ip:检验输入是否是ip地址,支持ipv4、ipv6。
Zend\Validator\Isbn:检验输入是否是一个ISBN-10或者ISBN-13的值。
Zend\Validator\Barcode:检验字符串是不是条码值。
Zend\Validator\Iban:检查字符串是否是国际银行编号。
Zend\I18n\Validator\PostCode:检验输入是否是邮编。
Zend\Validator\CreditCard:检验输入是否可能是一个信用卡号码,可设置信用卡发行单位的网络api检验。
Zend\Validator\Sitemap\xxx:sitemap xml 协议相关检验。
Zend\Validator\Step:检验数字值是否是基于baseValue和step所产生的值。
文件validator类:
Zend\Validator\File\Hash:检验文件的哈希值是否和提供的哈希值和算法匹配。
Zend\Validator\File\Crc32:检验文件的哈希值是否和提供的crc32哈希值匹配。
Zend\Validator\File\Md5:检验文件的哈希值是否和提供的md5哈希值匹配。
Zend\Validator\File\Sha1:检验文件的哈希值是否和提供的sha1哈希值匹配。
Zend\Validator\File\Extension:检验文件的扩展名。
Zend\Validator\File\ExcludeExtension:检验排除指定的文件扩展名。
Zend\Validator\File\MimeType:检验文件的MIME类型。
Zend\Validator\File\ExcludeMimeType:检验排除指定的文件MIME类型。
Zend\Validator\File\Exists:检验文件是否在指定的某个目录中存在。
Zend\Validator\File\NotExists:检验文件是否在指定的所有目录中都不存在。
Zend\Validator\File\IsCompressed:检验文件是否是一个压缩文件(zip、gzip等),根据MIME类型检验。
Zend\Validator\File\Size:检验文件的大小是否在指定范围内。
Zend\Validator\File\ImageSize:检验图像文件宽高是否在指定范围内。
Zend\Validator\File\IsImage:检验文件是否是图像文件(jpg、png等),根据MIME类型检验。
Zend\Validator\File\UploadFile:检验是否一个文件通过POST表单被上传了,并在发生上传错误的时候返回描述消息。
Zend\Validator\File\WordCount:检验文件内的单词数目是否在指定范围内。


0 0
原创粉丝点击