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

时间:2015-05-05 18:11:46

标签: php forms symfony entity symfony2-forms

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

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

由于

3 个答案:

答案 0 :(得分: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;
 }

答案 1 :(得分:3)

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

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

  1. Controller代码块中的if($form->isValid()){}中进行必要的修改。
  2. 创建表单事件并在填充之前/之后操作数据。 (Form eventsDynamic form modifications
  3. 两种选择都同样正确。您选择的内容取决于您的使用案例:

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

答案 2 :(得分:1)

我建议你在prePersist的回调中做到这一点。这是一个很好的做法。有关此http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks

的更多信息,请参阅此处