即使有错误,Symfony表单字段也有效?

时间:2016-08-11 12:26:13

标签: php validation symfony symfony-forms

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

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

表单是否已应用错误但仍标记为有效?

enter image description here

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

enter image description here

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我挖掘了代码并找到了这个片段:

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->isValid()检查表格当前是否有效,我们可以在以下代码段中看到:

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

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

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