【问题标题】:Symfony Form Field Valid Even With Errors?Symfony 表单字段即使有错误也有效?
【发布时间】:2026-02-11 11:35:01
【问题描述】:

我已将表单错误应用于表单集合字段(自定义字段集)。

if ($this->isFieldset($form, $field) && !empty($error)) {
    $form->get($field)->addError(
        new FormError(
            ucfirst(str_replace('_', ' ', $field)) . ' is invalid.')
        );
}

表单应用了错误但仍标记为有效?

正如您在控制器中看到的那样,在调用 isValid 之前,表单在 about_you 子项上存在错误?

有什么建议吗?

【问题讨论】:

  • 您是在调用$form->isValid()之前还是之后添加了数组?
  • 是的,我在第一次创建表单时添加它们(在一个被覆盖的形式因子类中,从 Redis 中提取错误并将它们添加回表单)。
  • 您是否尝试过为自定义字段集编写测试,或者只是从中创建了一个表单,然后在控制器中调用 getErrors()/isValid()?

标签: php validation symfony symfony-forms


【解决方案1】:

我翻遍了代码,发现了这个sn-p:

public function buildView(FormView $view, FormInterface $form, array $options)
{
   //...

    $view->vars = array_replace($view->vars, array(
        'errors' => $form->getErrors(),
        'valid' => $form->isSubmitted() ? $form->isValid() : true,  //<=== HERE
        'value' => $form->getViewData(),
        'data' => $form->getNormData(),
        'required' => $form->isRequired(),
        'size' => null,
        'label_attr' => $options['label_attr'],
        'compound' => $form->getConfig()->getCompound(),
        'method' => $form->getConfig()->getMethod(),
        'action' => $form->getConfig()->getAction(),
        'submitted' => $form->isSubmitted(),
    ));
}

这似乎是唯一设置valid 的地方。请注意,它发生在 buildView 期间!之后的一切都不会影响valid 的值。

然而,并非一切都是徒劳的,因为您可以简单地使用$form-&gt;isValid() 来检查表单是否当前有效,我们可以在下面的 sn-p 中看到:

public function isValid()
{
    if (!$this->submitted) {
        return false;
    }

    if ($this->isDisabled()) {
        return true;
    }

    return 0 === count($this->getErrors(true));
}

【讨论】:

  • 所以我可以在我的表单中覆盖 buildView 并手动设置它?我正在做一些奇怪的事情,这就是为什么我会出现意外行为。
  • 我认为这个答案具有误导性。问题绝对不在 FormView 中,从相关图像中可以看出。断点是在调用 createView() 之前设置的,并显示带有错误的 Element\Form(不是 FormView)。在该行拨打isValid()。进入下一行时,应跳过 if 块。 @Kal 你能确认会发生这种情况吗?
  • 老实说,我不知道。我刚刚看到您更新的问题,在我看来,您实际上确实在最后致电createView()。你的输出是在那之前的吗?
  • 你实际上让我走上了正轨。我重写了 buildView 方法并检查了表单字段是否有错误,非常感谢:)
最近更新 更多