【发布时间】:2017-07-01 02:58:24
【问题描述】:
我创建了一个带有任务实体的小型 Symfony (Sf3.2 + php7) 网络。我有我的控制器,我有一个新动作来创建一个新任务。一切都很好。现在,某些表单字段不需要填写(例如,创建日期)。所以我已经从我的taskType中删除了:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add->('name')->add('description');
}
现在我的表单看起来完全符合我的要求。令人惊讶的是,当我提交它时,我的控制器将它传递给教义,并且每个缺失的字段都写为 NULL。不!,我不想要那个,我想要的是我的默认 mysql 值。
好的,我阅读了文档。似乎有两种处理数据的方式:
$form->handleRequest($request);
$form->submit($request->request->get($form->getName()));
我在提交的 API(不是在文档中)中找到了第二个参数,一个布尔值:
API 说:
bool $clearMissing Whether to set fields to NULL when they are missing in the submitted data.
太棒了!这正是我所需要的。来看看吧:
public function newAction(Request $request) {
$task = new Task();
$form = $this->createForm('myBundle\Form\TaskType', $task);
$form->submit($request->request->get($form->getName()), false);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($task);
$em->flush();
$response = new Response();
$response->setContent(json_encode(array(
'data' => 'success',
)));
$response->headers->set('Content-Type', 'application/json');
return $response;
return $this->redirectToRoute('task_success');
}
return $this->render('task/new.html.twig', array(
'task' => $task,
'form' => $form->createView(),
));
}
好吧,在尝试了一切之后,我总是在所有缺失的字段中得到 NULL。我做错了什么。
谢谢你,卡特琳娜。
恐怕肯定还有更多。我在想这也许不是 Doctrine 的解决方案。 Symfony 日志向我显示了插入内容,它在每个空字段、空字段和缺失字段中设置了 Null。在状态等字段中,我可以在教义级别设置默认值,但如果我想设置 created_at 字段,我想必须是 Mysql 负责设置当前时间戳。
无论如何,这是我的任务实体的 ORM 属性状态。
/**
* @var \scrumBundle\Entity\Taskstatus
*
* @ORM\ManyToOne(targetEntity="scrumBundle\Entity\Taskstatus")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="status", referencedColumnName="id")
* })
* @ORM\Column(name="status", type="integer", nullable=false,options={"default":1})
*/
private $status;
这是来自 TaskStatus 的属性 ID:
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false, options={"default":1})
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
如您所见,我尝试按照您的建议设置选项默认值。我尝试创建以使用 handleRequest 设置表单并以相同的结果提交
$task = new Task();
$form = $this->createForm('scrumBundle\Form\TaskType', $task);
//$form->handleRequest($request);
$form->submit($request->request->get($form->getName()), false);
if ($form->isSubmitted() && $form->isValid()) {
我什至尝试一步一步调试提交函数,一个真正的地狱,因为提交对我来说是一个非常复杂的递归函数。
好的,再次感谢您的时间。 问候,凯特
附言。对不起我的英语不好。;^)
【问题讨论】:
-
您需要在您的实体中明确设置默认值。 Doctrine 总是会保留您实体中的所有字段,因此无论您的表单如何,它们仍然是“null”。在 ORM 列定义、LifecycleCallback 或实体的构造函数上设置默认值。在这里查看一些解决方案。 - stackoverflow.com/questions/3376881/default-value-in-doctrine
-
非常感谢!我怀疑我的实体。我一试就告诉你
-
Symfony 1 - Cate 0,查看我的编辑。请帮忙