多个字段上的UniqueEntity不显示错误消息

时间:2013-06-25 12:51:02

标签: validation symfony doctrine-orm constraints unique-constraint

我已将以下约束添加到我的实体:

 * @ORM\Table(name="link", uniqueConstraints={@ORM\UniqueConstraint(name="unique_link_idx", columns={"first_form_id", "first_question_id","last_form_id","last_question_id"})})
 * @UniqueEntity(fields={"firstForm", "firstQuestion","lastForm","lastQuestion"}, message="Cette liaison existe déjà !")
 * @ORM\Entity(repositoryClass="Ineat\LinkQuestionBundle\Entity\LinkRepository")

UniqueEntity约束很有效,因为在添加它之前,当尝试将完全相同的实体插入到DB时,我有一个DBALException abount完整性约束。 从那以后我不再有这个例外了,表单没有验证,但是{{ form_errors(form) }}没有打印任何消息。

签入控制器后$form->getErrors()返回一个空数组,而$form->getErrorsAsString()包含UniqueENtity约束。

如何显示我的UniqueEntity约束错误消息

2 个答案:

答案 0 :(得分:2)

由于UniqueEntity验证似乎在您的某个子表单中失败...

(因为错误消息仅出现在getErrorsAsString而非getErrors

...为了让父表单中的子表单错误可用,请使用error-bubbling:

$formBuilder->add('child-form','child-form-type', array(
       'error_bubbling' => true,
   )
)

...或在您的孩子表格内:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'error_bubbling' => true,
    ));
}

答案 1 :(得分:0)

有时会出现问题,因为实体未将错误消息绑定到右侧字段。使用validation.yml文件可以更好地控制错误消息的处理方式和位置。

# src/Ineat/LinkQuestionBundle/Resources/config/validation.yml
Ineat\LinkQuestionBundle\Entity\LinkRepository:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
            fields: [firstForm, firstQuestion, lastForm, lastQuestion]
            errorPath: lastQuestion
            message: 'This port is already in use on that host.'

此处提供更多信息:Symfony - UniqueEntity

同样将文本字符串放入“翻译”文件是很好的做法(即使您只使用/拥有一种语言)。您的views / entities / forms / controllers ...中不会包含任何文字。它们将全部位于您的翻译文件夹中,位于一个位置。如有必要,也可以一次更改重复的字符串。它看起来像这样:

# src/Ineat/LinkQuestionBundle/Resources/config/validation.yml
Ineat\LinkQuestionBundle\Entity\LinkRepository:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
            fields: [firstForm, firstQuestion, lastForm, lastQuestion]
            errorPath: lastQuestion
            message: 'linkquestion.form.errors.unique'

# src/Ineat/LinkQuestionBundle/Resources/translations/validators.fr.yml
linkquestion:
  form:
    errors:
      unique: "This port is already in use on that host."
# Or which ever structure you choose.

然后告诉你的应用程序它将永远是法语。