我正在尝试使用FormError向表单添加错误。当用户尝试使用现有名称创建集合时,必须显示错误。但是这段代码不起作用,我无法理解为什么
public function submitInObjectAction(Request $request)
{
$collection = new Collection();
$user = $this->getUser();
$form = $this->createForm(
new CollectionType(),
$collection
);
$form->handleRequest($request);
if ($form->isValid() && $form->isSubmitted()) {
$colname = $form["name"]->getData();
$existing = $this->getDoctrine()->getRepository('CollectionBundle:Collection')
->findBy(['name' => $colname, 'user' => $user]);
if ($existing != NULL) {
$error = new FormError("You already have collection with such name");
$form->get('name')->addError($error);
}
$em = $this->getDoctrine()->getManager();
$collection->setUser($user);
$em->persist($collection);
$em->flush();
return new JsonResponse([
'id' => $collection->getId(),
'name' => $collection->getName()
]);
}
}
我无法在Collection实体的名称字段上使用注释,因为名称必须仅对特定用户
唯一答案 0 :(得分:1)
我认为现在已经太晚了。当您致电$form->handleRequest()
时会发生表单验证,并且在调用$form->isValid()
时,您的验证应该完成。最好在链中进一步添加验证约束。有关详细信息,请参阅form validation上的Symfony指南,如有必要,请参阅the validation component。
我会使用注释在CollectionBundle中的Collection实体的name字段上设置唯一约束。
这不仅验证了这个用户输入表单,而且使用CollectionBundle和Doctrine的任何其他表单或组件或包甚至会阻止存储,具体取决于约束,使数据库保持整洁!
编辑:更高级验证的另一个选择是编写自定义form event侦听器。调用Form::handleRequest()
或Form::submit()
时会调度三个事件:FormEvents::PRE_SUBMIT
,FormEvents::SUBMIT
,FormEvents::POST_SUBMIT
。 This example还会显示如何访问表单本身。
$form = $formFactory->createBuilder()
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$user = $event->getData();
$form = $event->getForm();
// .. validation here
})
->getForm();