我有多级用户注册,我似乎错过了一些东西。
我有一个用户实体和一些其他数据嵌入我希望收集的表格中。为了举例,我们会说User有姓名和电子邮件,这些映射到用户实体上的字段。在同一表格中,我还将设备数据作为隐藏字段。
在我的用户实体上,我有一个验证组'计划',所以当我提交时,我会做这样的事情:
<?php
$user = new User();
$form = $this->createFormBuilder($user, array('validation_groups' => array('plan'))
->add('name')
->add('email')
->getForm();
$form->handleRequest($request)
if ($form->isValid()) {
$user = $form->getData();
$em->persist($user);
$em->flush();
} else {
return $this->render('myform.html.twig', array('form' => $form->createView()));
}
这主要是粗略的伪代码,但现在当我调用$ form-&gt; getData()或$ request-&gt; request-&gt; all()时,device_data被删除,无法找到。我可以通过不将$ user作为第一个参数传递给createFormBuilder来解决这个问题,但是我的验证组似乎没有发生,因为它绑定到用户实体。有办法解决这个问题吗?
答案 0 :(得分:2)
所以看起来问题并不像我说的那样,我事先知道的正确解决方案是 - &gt; add('fieldname',null,array('mapped'=&gt; false)),但是由于实现细节和使用DomCrawler,这对我不起作用。
然后,您可以通过请求对象访问未映射的字段。
$request->request->get('form[fieldname]')
答案 1 :(得分:1)
安德鲁的答案很好,但如果你想进行“直接验证”(通过$form->isValid()
方法)你宁愿使用这样的东西
$form = $this->createFormBuilder($user, array('validation_groups' => array('plan'))
->add('name')
->add('email')
->add('agree','checkbox', array('mapped' => false, 'constraints' => array(new NotBlank()))
->getForm();
例如,agree
字段,这是一个复选框,您必须检查“接受条款和条件”才能继续。
mapped => false
告诉createFormBuilder
不要将该字段与实体字段相关联,因为它不会出现