我有一个实体,该实体具有称为dateTime的end_date的字段。在我的象征形式中,我有一个未打印的领域,您可以选择几天,例如3天,5天,7天。
我需要做的是操纵表格提供的天数(我不想进入DB),并进行计算何时结束_date与所选天数有关然后坚持end_date。
我遇到的麻烦是如何在创建形式和将实体持续到db之间进行数据操作。
这是我的表格的功能:
public function saveNewListing($request, $controller){
$listing = new Listing();
$product = new Product();
$listing->setProduct($product);
$product->setUser($controller->getUser());
$form = $controller->createForm(new SellType(), $auction)->handleRequest($request);
if($form->isValid()) {
$em = $controller->getDoctrine()->getManager();
$em->persist($listing);
$em->persist($product);
$em->flush();
return true;
}
return $form;
}
因此,在绑定表单数据和实体并检查表单是否有效之间,我应该在哪里操纵数据?我还需要将新的end_date绑定到表单上吗?还是只将其绑定到实体?
谢谢
if($form->isValid()) {
$em = $controller->getDoctrine()->getManager();
$days = $request->get("form")["days"]
//* calc end date here $endDate as DateTime */
$listing->setEndDate($endDate);
$em->persist($listing);
$em->persist($product);
$em->flush();
return true;
}
尽管 @evgeniy的答案在技术上是正确的,但我想将其扩展一点。
当您以Symfony创建表单,然后调用handleRequest
方法时,将使用所有提交字段填充表单。如果要操纵表格的数据,则有两个可能的选择:
- 在
if($form->isValid()){}
代码块中的Controller
中进行任何必要的修改。 - 创建表单事件并在填充数据之前/之后操纵数据。(形式事件,动态形式修改)
这两个选项都是正确的。您选择的内容取决于您的用例:
- 如果您要在一个特定位置使用此
FormType
,则可以轻松地在Controller
内定义逻辑。 - 但是,如果您的
FormType
将包含在其他地方,并且需要保持与编写表单事件听众/订阅者相同的功能。这将消除编写Controller
中的任何代码的需求,并为您提供最终的Entity
,准备保存到数据库中,而无需进行任何进一步的修改(因为您创建的事件侦听器已经完成了它们)。/li>
我建议您在对待主义者的回调中做到这一点。这是一个很好的做法。查看有关此http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks