Zend_Filter_InputZend_Filter_Input 提供了一个声明接口来联合多重过滤器和校验器,使用 它们来收集数据并在用过滤器和校验器处理之后来获取输入值。为 HTML 输出 安区起见,缺省的返回值是转义格式。 形象地说,这个类是一个外部数据的笼子。数据从外部资源输入到程序,如 HTTP 请求参数、HTTP 头、web 服务或者甚至从数据库或其它文件读取的数据。 首先把数据放入笼子,随后程序只可以通过告诉笼子数据应该是什么样子和如何 使用它来访问数据。笼子检验数据的合法性。对于适当的上下文,可能使用 转义数据。在全部符合这些条件时,笼子才释放数据。用一个简单方便的接口, 它鼓励好的变成习惯并使开发者仔细考虑如何使用数据。
为使用 Zend_Filter_Input,执行下列步骤:
下面一节描述使用这个类的步骤。 声明过滤器和校验器规则在创建 Zend_Filter_Input 实例之前,声明过滤器规则数组和校验器规则数组。 这个关联数组映射规则名到过滤器或校验器,或者过滤器或校验器链。 在下面的例子中,过滤器规则设置声明 'month' 字段由 Zend_Filter_Digits 来过滤,'account' 字段由 Zend_Filter_StringTrim 来过滤。校验器规则设置 声明只有如果 'account' 字段只包含字母字符时有效。 <?php $filters = array( 'month' => 'Digits', 'account' => 'StringTrim' ); $validators = array( 'account' => 'Alpha' );
在上述 可以用若干格式来声明一个规则:
你可以在过滤器数组或校验器数组里使用特殊的“通配符”规则键'*'。 意思是在这个规则中声明的过滤器或校验器将应用于所有输入数据域。 注意在过滤器数组或校验器数组里的条目的顺序意义重大,规则使用和你声明时的相同顺序。 <?php $filters = array( '*' => 'StringTrim', 'month' => 'Digits' ); 生成过滤器和校验器的处理器在声明过滤器或校验器数组后,把它们用作 Zend_Filter_Input 的构造器的参数。 它返回一个知道所有过滤和校验规则的对象,你可以用这个对象来处理一组或多组输入数据。 <?php $input = new Zend_Filter_Input($filters, $validators);
你可以指定输入数据为第三个构造器参数。数据结构是个关联数组。
键是字段名,值是数据值。在 PHP 中标准的 <?php $data = $_GET; $input = new Zend_Filter_Input($filters, $validators, $data);
另外,使用 <?php $input = new Zend_Filter_Input($filters, $validators); $input->setData($newData);
获取校验过的字段和其它报告在声明过滤器和校验器与创建输入处理器之后,你可以获取丢失的、未知的和无效字段的报告。 你也可以在应用过滤器之后获得字段的值。 输入值有效的查询
如果所有输入数据通过校验, <?php if ($input->isValid()) { echo "OK\n"; }
该方法接受一个可选的字符串参数,即一个独立字段。如果指定的字段
通过校验并为读取准备好, <?php if ($input->isValid('month')) { echo "Field 'month' is OK\n"; } 获得无效、丢失或未知的字段
<?php if ($input->hasInvalid() || $input->hasMissing()) { $messages = $input->getMessages(); } // getMessages() simply returns the merge of getInvalid() and getMissing() if ($input->hasInvalid()) { $invalidFields = $input->getInvalid(); } if ($input->hasMissing()) { $missingFields = $input->getMissing(); } if ($input->hasUnknown()) { $unknownFields = $input->getUnknown(); }
The
你可以指定使用 'missingMessage' 选项的 <?php $options = array( 'missingMessage' => "Field '%field%' is required" ); $input = new Zend_Filter_Input($filters, $validators, $data, $options); // alternative method: $input = new Zend_Filter_Input($filters, $validators, $data); $input->setOptions($options);
获得有效字段
所有不是无效的、丢失的、未知的字段都是有效的(好像废话一样 Jason Qi)。
你可以用魔术访问器来获得有效字段的值。也有非魔术访问器方法 <?php $m = $input->month; // escaped output from magic accessor $m = $input->getEscaped('month'); // escaped output $m = $input->getUnescaped('month'); // not escaped 缺省地,当读取一个值时,用 Zend_Filter_HtmlEntities 来过滤。 因为它是在 HTML 中输出字段值的最普通的用法,所以它是缺省的。 HtmlEntities 过滤器有助于防止无意识的、可能会导致安全问题的代码输出。
你可以通过在构造器选项数组里指定转义值来为它指定一个不同的过滤器: <?php $options = array('escapeFilter' => 'StringTrim'); $input = new Zend_Filter_Input($filters, $validators, $data, $options);
另外,你也可以使用 <?php $input = new Zend_Filter_Input($filters, $validators, $data); $input->setDefaultEscapeFilter(new Zend_Filter_StringTrim()); 对于任何一种用法,你可以指定转义过滤器作为过滤器类的字符串基础名 或者过滤器类的对象实例。转义过滤器可以是过滤器链的实例、Zend_Filter 类的对象。
转义输出的过滤器应当确保在校验之后运行,其它在过滤器规则的数组中声明的过滤器在数据校验之前应用。
如果转义过滤器在校验之前运行,校验的处理将会很复杂,也将很难提供转义的和非转义的数据版本。
建议使用
只有一个方法 使用 Metacommands 来控制过滤器或校验器规则除了声明从字段到过滤器或校验器的映射,你可以在数组声明中指定一些 "metacommands" ,开控制一些 Zend_Filter_Input 的可选的行为。 Metacommands 在给定的过滤器或校验器数组值里以字符串索引条目的形式出现。 The |
编写过滤器 |