0

我有一个实体,它有一个名为 end_date 的字段,它是日期时间。在我的 symfony 表单中,我有一个未绑定的字段,您可以选择天数,例如 3 天、5 天、7 天。

我需要做的是操纵表单提供的天数(我不想进入数据库)并计算结束日期与所选天数相关的时间,然后持续end_date。

我遇到的问题是如何在创建表单和将实体持久化到数据库之间进行数据操作。

这是我对表单的功能:

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 绑定到表单吗?或者只是将它绑定到实体?

谢谢

4

3 回答 3

4
   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;
 }
于 2015-05-05T18:23:09.907 回答
3

尽管@Evgeniy 的回答在技术上是正确的,但我想稍微扩展一下。

当您在 Symfony 中创建表单并调用该handleRequest方法时,表单将填充所有提交的字段。如果您想操作表单的数据,您有两种可能的选择:

  1. Controllerif($form->isValid()){}代码块中进行任何必要的修改。
  2. 创建表单事件并在填充数据之前/之后操作数据。(表单事件动态表单修改

两种选择都同样正确。您选择什么取决于您的用例:

  1. 如果您打算FormType在一个特定的地方使用它,您可以轻松地在Controller.
  2. 但是,如果您FormType将被包含在其他地方并且需要维护相同的功能,您应该编写表单事件侦听器/订阅者。这将消除在其中编写任何代码的需要,Controller并为您提供最终Entity准备好保存到数据库中而无需任何进一步修改(因为它们已经在您创建的事件侦听器中完成)。
于 2015-05-05T19:07:59.397 回答
1

我建议你在 prePersist 的回调中这样做。这是一个很好的做法。请参阅有关此http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks的更多信息

于 2015-05-05T19:58:12.107 回答