Zend\Input 回退值

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

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

相关文章