1

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

 * @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 约束运行良好,因为在添加它之前,当尝试将完全相同的实体插入数据库时​​,我有一个 DBALException abount 完整性约束。从那以后我再也没有这个异常了,表单没有验证但{{ form_errors(form) }}不打印任何消息。

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

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

4

2 回答 2

2

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

(因为错误消息只存在于getErrorsAsString而不存在于getErrors

...为了让父表单中的子表单错误可用,请使用错误冒泡:

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

...或在您的孩子形式内:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'error_bubbling' => true,
    ));
}
于 2013-06-25T13:01:28.510 回答
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.

然后告诉您的应用程序它将始终使用法语。

于 2015-01-29T22:16:35.643 回答