将错误添加到Symfony2表单

时间:2015-11-12 15:48:18

标签: symfony

我正在尝试使用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实体的名称字段上使用注释,因为名称必须仅对特定用户

唯一

1 个答案:

答案 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_SUBMITFormEvents::SUBMITFormEvents::POST_SUBMITThis example还会显示如何访问表单本身。

$form = $formFactory->createBuilder()
    ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $user = $event->getData();
        $form = $event->getForm();
        // .. validation here
    })
    ->getForm();