【问题标题】:symfony form isvalid eqauls false but has no errorsymfony form isvalid eqauls false 但没有错误
【发布时间】:2017-02-22 16:16:47
【问题描述】:

我正在开发一个 symfony 项目,该项目已经上线并使用原则。我在下面描述的问题是新问题,我确定它是由我引起的,但我无法确认这一点,因为我不确定如何调试。

我有一个简单的表单(它提交两个字段),通过转储以下内容,我可以看到这两个值都已正确提交:

$form->handleRequest($request);

问题是虽然我可以看到提交的值,但是表单没有通过验证:

if ($form->isValid() === false)

这曾经通过验证,可能是 4 周前,所以这是我最近做的事情。

我已转储 $form->getErrors(true); 以查看是否可以找到错误,但它返回:

RenderController.php on line 20:
FormErrorIterator {#685 ▼
 -form: Form {#691 ▶}
 -errors: []
}

所以除非我弄错了,否则这里没有发现错误,因为错误是空的。

我读到$form->isValid() 检查数据模型,即底层实体对象。

我最近对实体进行了更改。我首先向数据库添加一个字段,然后进入实体类手动更新它。

添加新字段时是否可能做错了什么?让我感到困惑的是,使用新字段的其他形式,我没有遇到任何问题。

我不应该手动完成吗?如何进一步调试表单?

【问题讨论】:

  • doctrine:schema:validate 查看您的数据库是否同步。如果您使用 git,请检查 git bisect 以找出有缺陷的提交。
  • 要检查它是否有效,您通常使用:if ( $form->isValid() ),如果有效则返回 true。如果您想检查它是否无效,请使用if ( !$form->isValid() )。所以你不需要额外的=== false
  • doctrine:schema:validate 说映射文件是正确的。
  • === 用于比较相同的types。由于您正在检查它是否无效并且isValid() 返回一个布尔值,那么您应该使用if( !$form->isValid() )。你想让我把这个作为答案发布吗?我不确定这是否解决了您要解决的问题?
  • === false 可能不是很漂亮,但也没有错。事实上,它清楚地表明您实际上是在检查布尔值而不是其他“虚假”值,例如空字符串或 null

标签: php forms symfony doctrine


【解决方案1】:

这可能是由 symfony 中的验证方式引起的。 正如您正确写的那样, $form->isValid() 实际上并没有验证表单本身。而是验证底层实体。

现在棘手的部分来了:不仅验证表单中存在的字段,还验证实体的每个字段。如果您的表单仅代表您的实体的一部分,则会发生所描述的效果。 可能其中一个添加的字段具有 NotBlank 断言(或类似的),但在您的表单中不存在。对于一个新实体,这将始终失败。并且由于表单中不存在该字段,因此表单中也没有错误。

要解决此问题,请扩展您的表单,从新字段中删除断言或查看validation groups

【讨论】:

  • 我可能需要一些时间来完成这个建议,但它与我读过的其他答案一致,当它没有返回错误时讨论 isValid() 的类似问题。谢谢你。这个答案有帮助,我会尽快回复原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多