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. 上传Android代码到gerrit服务器

    1. 配置default.xml default.xml是跟Android代码配套的,可参考google Android源码下的default.xml(.repo/manifests/default. ...

  2. c++ 四种类型转换机制

    类型转换机制可以分为:隐式类型转换 和 显示类型转换(强制类型转换) C中的类型转换: 事情要从头说起,这个头就是C语言.我们已经习惯了使用C-like类型转换,因为它强大而且简单. 主要有一下两种形 ...

  3. 【转】DOS与linux的断行字符

    转自:http://www.2cto.com/os/201109/104833.html 今天配置linux的dns服务器,在配置的时候,在linux下修改配置文件感觉很麻烦,于是想到把配置文件拿到w ...

  4. Android FileProvider相关 Failed to find configured root that contains

    问题: 使用FileProvider构造SD卡中文件uri时异常 java.lang.IllegalArgumentException: Failed to find configured root ...

  5. cordova科大讯飞语音识别

    cordova-plugin-IFlyspeech 科大讯飞的语音听说读写的cordova插件 Supported Platforms iOS android Installation 插件安装命令: ...

  6. PHP基础知识测试题及解析

      本试题共40道选择题,10道判断题,考试时间1个半小时 一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A ) A:Windows系统 B:Apache服务器 C:MyS ...

  7. IIS中实现http自动转换到https

    IIS中实现http自动转换到https修改以下文件:C:\WINDOWS\Help\iisHelp\common\403-4.htm 为以下内容<!DOCTYPE HTML PUBLIC &q ...

  8. 详谈java集合框架

    1.为什么使用集合框架 当我们并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架 2.Java集合框架包含的内容 接口:(父类)Collection接口下包含Li ...

  9. mysql 如何用命令清除表数据,让表数据索引是从0开始呢?

    truncate MYTABLE 这样就可以了 其实这个命令就相当于删除表再建 所有的数据都还原 可以使用工具来完成这个操作 右键单击要操作的表,选择Turncale Table 执行查询语句,数据就 ...

  10. Scrapy爬虫框架 基础

    1< scrapy的安装 命令行安装 pip install scrapy <常见错误是缺少 wim32api 安装win32api pip install pywin32 <还有就 ...