我已将以下约束添加到我的实体:
* @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约束错误消息
答案 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.
然后告诉你的应用程序它将永远是法语。