基于另一个(postPersist)Doctrine2的创建创建一个新实体

时间:2011-12-22 04:44:34

标签: symfony doctrine-orm

我正在尝试基于另一个实体创建一个新实体。示例:我有一段感情

Sale <-- 1:M --> Payment

现在,当我坚持Sale时,你必须创建一个初始Payment,但我不确切知道它是怎么做的。

我试过了:

  1. 使用@ORM\HasLifecycleCallbacks()@ORM\prePersist@ORM\postPersist,但这些方法无法获取参数,我无法保留实体Payment。我甚至尝试将SalePayment(在prePersist方法$payment->setSale($this)中)联系起来,希望EntityManager能够为我保留Paymentinfo from here
  2. 我试图创建一个监听器(guided from here),但它只是不起作用,在任何时候监听器都没有运行
  3. 在我的SaleController::createAction()中这样做,这种方式显然很简单并且有效,但这并不优雅,也违背了我的应用程序的良好设计,此操作是业务逻辑的一部分,并在各种重复份

2 个答案:

答案 0 :(得分:4)

在你看来的3个解决方案中,3个在我看来仍然是最不对的。它很简单,不会过于复杂,以后也很容易重构。

但如果您正在寻找一个干净的解决方案,我认为您需要的是表单处理程序或类似的服务。 看看FOSUserBundle one

基本上你会创建一个PaymentManager类&amp;处理完所有销售表单后,将所有收集的信息传递给PaymentManager,让它处理Payment实体的所有创建/持久逻辑。

答案 1 :(得分:1)

我建议@Inori建议的PaymentManager是最好的方法,它是DRY,也是创建实体的中心点。它允许您封送控制器中的所有用户输入,然后将其传递给管理器以正确构建Sale对象。

如果您希望使用 1st 选项并使用生命周期回调,我假设您收到一个异常,说明在另一个实体上发现了一个非托管实体 - 或类似的东西。要解决此问题,您可以级联保留映射,这意味着您无需为persist调用Payment

/**
 * One-to-Many via Join Table (aka One-To-Many Unidirectional).
 * @ORM\ManyToMany(targetEntity="Payment", cascade={"persist"})
 * @ORM\JoinTable(
 *      inverseJoinColumns={
 *          @ORM\JoinColumn(unique=true, onDelete="CASCADE")
 *      }
 * )
 */

如果您感到困惑,可以阅读有关One-To-One, Unidirectional的更多信息。

另外,您应该阅读有关级联持久性Transitive persistence / Cascade Operations的信息。