在持久化实体之前处理表单数据 - Symfony 2.6

Manipulate form data before persisting entity - Symfony 2.6

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

我需要做的是操纵表格提供的天数(我不想进入数据库)并计算结束_date 的时间与天数的关系select 天,然后坚持 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 绑定到表单吗?或者只是将其绑定到实体?

谢谢

   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 方法时,该表单将填充所有提交的字段。如果你想操作你的表单数据,你有两个可能的选择:

  1. if($form->isValid()){} 代码块中的 Controller 进行必要的修改。
  2. 创建表单事件并操作已填充的数据before/after。 (Form events, Dynamic form modifications)

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

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

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