ZF2有非常多内建的Filter和Validator组件,能够方便地对表单数据进行处理。

Filter的作用是过滤表单数据。比如,去除一些空格,替换一些敏感词等。

Validator的作用是检验表单数据是否合规,假设不合规。则提供不合规原因的文本消息。

如果有这样一个Form:

表单数据存储到数据库之前的要求是:

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

password:password1和password2必须同样。长度限制。

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

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

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

首先,Form的构造函数加入主要的html标签元素:

class TestForm extends Form  implements InputFilterProviderInterface{

    protected $adapter;
protected $inputFilter; public function __construct($adap) { parent::__construct('test'); $this->adapter = $adap;//因为该检验“数据库必须不存在该username”会用到“Zend\Validator\Db\RecordExists”,该validator须要数据库adpater初始化,因此,构造函数必须接收一个adapter參数 $this->add(array(
'name' => 'userName',
'type' => 'Text',
'options' => array(
'label' => 'username:',
),
'attributes' => array(
'size' => 60,
'maxlength' => 100,
),
));
$this->add(array(
'name' => 'password1',
'type' => 'Password',
'options' => array(
'label' => '密码:',
),
'attributes' => array(
'size' => 60,
'maxlength' => 100,
),
));
$this->add(array(
'name' => 'password2',
'type' => 'Password',
'options' => array(
'label' => '再次输入密码:',
),
'attributes' => array(
'size' => 60,
'maxlength' => 100,
),
));
$this->add(array(
'name' => 'email',
'type' => 'Text',
'options' => array(
'label' => '邮箱:',
),
'attributes' => array(
'size' => 60,
'maxlength' => 100,
),
));
$this->add(array(
'name' => 'mobile',
'type' => 'Text',
'options' => array(
'label' => '手机:',
),
'attributes' => array(
'size' => 60,
'maxlength' => 100,
),
));
$this->add(array(
'name' => 'ifenc',
'type' => 'Radio',
'options' => array(
'label' => '是否加密:',
'value_options' => array(
'yes' => '是',
'no' => '否',
)
),
));
$this->add(array(
'name' => 'content',
'type' => 'Textarea',
'options' => array(
'label' => '内容:',
),
'attributes' => array(
'cols' => 80,
'rows' => 6,
),
));
$this->add(new Csrf('security'));//这个element阻止跨网站伪造请求攻击
$this->add(array(
'name' => 'send',
'type' => 'Submit',
'attributes' => array(
'value' => '确定',
),
));
}
}

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

class TestForm extends Form  implements InputFilterProviderInterface{

    public function getInputFilterSpecification() {
return array(
'userName' => array(
'required' => true,
'filters' => array(
array('name' => 'StringTrim'),//去除前后空格
array('name' => 'StringToLower'),//转为小写字符
),
'validators' => array(
array('name' => 'NotEmpty'),//不同意为空
array('name' => 'Alnum'),//注意,Zend\I18n\Validator\Alnum要求打开intl的php扩展。详细做法是。打开php.ini文件。将“extension=php_intl.dll”前面的“;”删除。然后重新启动web服务就可以。
array(
'name' => 'StringLength',//限制长度
'options' => array(
'encoding' => 'UTF-8',
'min' => 3,
'max' => 256,
),
),
array(
'name' => 'Db\NoRecordExists',//不同意数据库已存在该username,说明,数据库中有表user。user表有字段name就是存储的username。因此。该validator就是检验user表的name字段
'options' => array(
'table' => 'user',
'field' => 'name',
'adapter' => $this->adapter,
),
),
),
),
'password1' => array(
'required' => true,
'validators' => array(
array(
'name' => 'StringLength',//限制长度
'options' => array(
'encoding' => 'UTF-8',
'min' => 6,
'max' => 6,
),
),
),
),
'password2' => array(
'required' => true,
'validators' => array(
array(
'name' => 'StringLength',//限制长度
'options' => array(
'encoding' => 'UTF-8',
'min' => 6,
'max' => 6,
),
),
array(
'name' => 'Identical',//检验是否和password1同样,Zend\Validator\Identical能够用于检验还有一个元素和自己是否同样
'options' => array(
'token' => 'password1',
),
),
),
),
'email' => array(
'required' => true,
'validators' => array(
array(
'name' => 'StringLength',//限制长度
'options' => array(
'encoding' => 'UTF-8',
'min' => 3,
'max' => 256,
),
),
array('name' => 'EmailAddress'),//检验邮箱格式,Zend\Validator\Identical\EmailAddress专门用于检验邮箱格式
),
),
'mobile' => array(
'required' => true,
'validators' => array(
array(
'name' => 'StringLength',//限制长度
'options' => array(
'encoding' => 'UTF-8',
'min' => 11,
'max' => 11,
),
),
array('name' => 'Digits')//必须为数字字符
),
),
'ifenc' => array(
'required' => true, ),
'content' => array(
'required' => true,
'filters' => array(
array(
'name' => 'PregReplace',//替换敏感词
'options' => array(
'pattern' => '/SB/',
'replacement' => '**'
),
),
array(
'name' => '\Zend\Filter\Callback',//加尾巴的自己定义filter回调
'options' => array(
'callback' => array('Test\Form\MyAddTailFilter', 'addTail')//MyAddTailFilter是自己定义的一个filter回调
),
),
),
'validators' => array(
array('name' => 'NotEmpty'),//不同意为空
array(
'name' => 'StringLength',//限制长度
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 1024,
),
),
),
),
);
}
}

当中,为content加入尾巴的filter回调类MyAddTailFilter代码例如以下:

namespace Test\Form;

class MyAddTailFilter {
public function addTail($param){
$ret = $param."----hello world !";
return $ret;
}
}

控制器:

use Zend\Filter\Encrypt;
use Zend\Filter\Decrypt;
use Test\Form\TestForm;
use Test\Form\MyValidatorTranslator; class TestController extends AbstractActionController { public function testformAction() { $form = new TestForm($this->getServiceLocator()->get('Zend\Db\Adapter\Adapter'));//为检验是否username已存在的validator提供数据库adapter
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
if ($form->isValid()) {
$filteredValues = $form->getInputFilter()->getValues();//检验成功后。获取过滤后的数据 //将email和手机号码加密
$encKey = '123456';
$enc = new Encrypt(array('adapter' => 'BlockCipher'));//创建加密filter
$enc->setKey($encKey);//设置key
$enc->setVector('12345678901234567890');//加盐
//加密email
$filteredValues['email'] = $enc->filter($filteredValues['email']);
//加密手机号
$filteredValues['mobile'] = $enc->filter($filteredValues['mobile']); //解密
//$dec = new Decrypt(array('adapter' => 'BlockCipher'));
//$dec->setKey($encKey);//设置key
//$filteredValues['email'] = $dec->filter($filteredValues['email']);
//$filteredValues['mobile'] = $dec->filter($filteredValues['mobile']); //将$filteredValues保存到数据库
//......
}
} return array(
'tform' => $form,
);
}
}

testform.phtml

$this->tform->setAttribute('action', $this->url('test', array('action' => 'testform')));
$this->tform->setAttribute('method', 'POST');
$this->tform->prepare(); echo "<div class='tf'>";
echo '<div>'.$this->form()->openTag($this->tform).'</div>';
//$um = $this->tform->get('userName');
//echo '<div>'.$this->formLabel($um).$this->formText($um).$this->formElementErrors($um).'</div>';
echo '<div>'.$this->formRow($this->tform->get('userName')).'</div>';
echo '<div>'.$this->formRow($this->tform->get('password1')).'</div>';
echo '<div>'.$this->formRow($this->tform->get('password2')).'</div>';
echo '<div>'.$this->formRow($this->tform->get('email')).'</div>';
echo '<div>'.$this->formRow($this->tform->get('mobile')).'</div>';
$yn = $this->tform->get('ifenc');
echo "<div>".$this->formLabel($yn).$this->formRadio($yn).$this->formElementErrors($yn).'</div>';//对Radio标签,直接用$this->formRow显示的效果非常难看,因此,先formLabel,在formRadio,最后显示检验失败原因的消息formElementErrors
//echo '<div>'.$this->formRow($this->tform->get('ifenc')).'</div>';
echo '<div>'.$this->formRow($this->tform->get('content')).'</div>';
echo '<div>'.$this->formHidden($this->tform->get('security')).'</div>';
echo '<div>'.$this->formRow($this->tform->get('send')).'</div>';
echo '<div>'.$this->form()->closeTag().'</div>';
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:检查输入是否在数据库某个表某个字段不存在,可用于检查username是否已注冊等。

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:检验文件内的单词数目是否在指定范围内。



ZendFramework2学习笔记 表单过滤、表单验证的更多相关文章

  1. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  2. Flutter学习笔记(13)--表单组件

    如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...

  3. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  4. SpringMVC:学习笔记(5)——数据绑定及表单标签

    SpringMVC——数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...

  5. ng2 学习笔记(二)表单及表单验证

    在上一篇文章中提到了表单,只说了表单的数据绑定,这一篇文章主要讲一下表单验证,为什么把表单单独拿出来学习,主要是因为,表单是商业应用的支柱,我们用它来执行登录.求助.下单.预订机票.安排会议,以及不计 ...

  6. SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

    Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   ...

  7. HTML5学习笔记五:html5表单

    表单是页面上非常重要的一块内容,用户可输入的大部分内容都是在表单元素中完成的,与后台的交互大多数也是通过点击表单中的按钮. 一.新增的元素和属性 1.新增属性: 1.1 form属性:页面中的任何元素 ...

  8. Javascript高级编程学习笔记(75)—— 表单(3)表单字段

    表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...

  9. Javascript高级编程学习笔记(74)—— 表单(2)表单提交及重置

    表单提交 表单的很大一部分作用就是帮助用户完成和服务器的交互 所以表单提交是表单中比较重要的部分 虽然现如今的大部分应用场景都使用 AJAX 的异步请求来代替表单,但是仍有部分操作需要使用表单来完成, ...

随机推荐

  1. 【知识总结】扩展卢卡斯定理(exLucas)

    扩展卢卡斯定理用于求如下式子(其中\(p\)不一定是质数): \[C_n^m\ mod\ p\] 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原问题 首先对\(p\)进行质因数分解: \[ ...

  2. 胖ap和瘦ap的区别

    一,什么是AP,胖瘦AP如何区分?       先说说AP的概念.AP是Access Point的简称,即无线接入点,其作用是把局域网里通过双绞线传输的有线信号(即电信号)经过编译,转换成无线电信号传 ...

  3. strcpy 和 memcpy自实现

    都是套路,详见代码注释: #include <stdio.h> #include <assert.h> #include <iostream> using name ...

  4. [转]HTML5 Day 4: Add Drop Down Menu to ASP.NET MVC HTML5 Template using CSS and jQuery

    本文转自:http://pietschsoft.com/post/2010/11/17/HTML5-Day-4-Add-DropDown-Menu-ASPNET-MVC-HTML5-Template- ...

  5. ansj --词性说明

    背景 Ansj 是一个开源的 Java 中文分词工具,基于中科院的 ICTCLAS 中文分词算法,比其他常用的开源分词工具(如mmseg4j)的分词准确率更高.工具支持词性标注,所以就可以依据词性进行 ...

  6. 一个.py引用另一个.py中的方法

    处理函数 X_Add_Y_Func.py #__author__ = 'Administrator' def add_func(x, y): return x+y 调用函数 X_Add_Y_Func_ ...

  7. ABP生成错误:必须添加对程序集“netstandard”的引用

    当前使用ABP版本为:4.6.0 升级vs2017到15.4版本,升级framework到4.7版本 如果Core版本请升级到net core 2

  8. 使用ScriptManager服务器控件前后台数据交互

    前台页面信息: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFor ...

  9. 基于python xlsxwriter、xlrd 生成测试报告

    import xlsxwriter,xlrd ''' 思路: 1.获取数据 2.整合数据 3.写入文件 ''' #筛选 def filt(category,table,filt_name=None,r ...

  10. PHP 数据库连接 (Mysql Mysqli PDO)

    1.PHP与Mysql扩展(本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除),PHP原生的方式去连接数据库,是面向过程的 <?php $mysql_conf = array( 'hos ...