在坚持实体之前操纵形式数据-Symfony 2.6



我有一个实体,该实体具有称为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方法时,将使用所有提交字段填充表单。如果要操纵表格的数据,则有两个可能的选择:

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

这两个选项都是正确的。您选择的内容取决于您的用例:

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

我建议您在对待主义者的回调中做到这一点。这是一个很好的做法。查看有关此http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks

的更多信息。

最新更新