最近针对 Zend\InputFilter 报告了一个 问题 ,其中未正确填充回退值。 Matthew 调查并修复了它,并让我对其进行审查。
我很着迷,因为我没有意识到(或者完全忘记了!)Zend\Input 和 Zend\InputFilter 支持回退值,所以我研究了它,结果发现它很简单,而且正如其名称所暗示的那样工作。
对于直接使用 Input 的基本情况,您可以像这样使用它:
<?php
$name = new \Zend\InputFilter\Input('name');
$validators = $name->getValidatorChain();
$validators->addValidator(new \Zend\Validator\StringLength(5), true);
$name->setFallbackValue('Rob Allen');
$name->setValue('');
$isValid = $name->isValid();
var_dump($name->getValue());
输出是“Rob Allen”。
也就是说,当提供的值为空时,将设置并使用回退值。
一条皱纹
然而,有一个皱纹!有时 $name->getValue() 返回一个空字符串,这是由于我 已经讨论过的 required、allow_empty 和 continue_if_empty 的特定组合而发生的。
如果 continue_if_empty 为 false,则 required 和 allow_empty 的组合会影响在 isValid() 之后调用 getValue() 时获得回退值还是空字符串:
必需的 | 允许空 | 会发生什么 |
---|---|---|
真的 | 错误的 | 对于空值,回退值在 getValue() 中返回。 |
真的 | 真的 | 回退值将被忽略,并且在 getValue() 中返回一个空值。 |
错误的 | 错误的 | 回退值将被忽略,并且在 getValue() 中返回一个空值。 |
错误的 | 真的 | 回退值将被忽略,并且在 getValue() 中返回一个空值。 |
如果将此表与 上一篇文章 中的表进行比较,您会注意到在验证程序未运行的三种情况下,未设置回退值。这并不奇怪,因为这些组合会导致 isValid() 短路。
测试应用
同样,我使用了一个测试应用程序来检查这一点
<?php
$name = new \Zend\InputFilter\Input('name');
$validators = $name->getValidatorChain();
$validators->addValidator(new \Zend\Validator\StringLength(5), true);
$name->setFallbackValue('Rob Allen');
$name->setValue('');
$isValid = $name->isValid();
var_dump($name->getValue());
和以前一样,这个应用程序简单地运行所有 required、allow_empty 和 continue_if_empty 的组合,针对 Zend\InputFilter\Input 设置回退值,看看会发生什么。
这是输出:
<?php
$name = new \Zend\InputFilter\Input('name');
$validators = $name->getValidatorChain();
$validators->addValidator(new \Zend\Validator\StringLength(5), true);
$name->setFallbackValue('Rob Allen');
$name->setValue('');
$isValid = $name->isValid();
var_dump($name->getValue());
Zend\InputFilter
请注意,通过本文开头讨论的修复,Zend\InputFilter 的工作方式与 Zend\Input 完全相同,正如您所期望的那样。此修复程序也被移植到 2.4 版本,因此如果您使用回退值,请确保您使用的是最新的 2.4 或 2.5 版本。
结论
如果你想在 Zend\Input 中使用回退值,请确保将 required 设置为 true 并将 allow_empty 设置为 false。幸运的是,这是默认设置,所以这可能就是您正在做的事情!