Zend\Input 回退值

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

最近针对 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。幸运的是,这是默认设置,所以这可能就是您正在做的事情!