基于创建另一个(postPersist)Doctrine2
问题描述:
创建一个新实体我试图创建一个基于另一个创建的新实体。例如:我有一个关系基于创建另一个(postPersist)Doctrine2
Sale <-- 1:M --> Payment
现在,当我坚持一个Sale
,则必须创建初始Payment
但我不知道究竟是如何做到这一点。
我已经尝试:
- 使用
@ORM\HasLifecycleCallbacks()
,@ORM\prePersist
或@ORM\postPersist
,但这些方法并没有得到论据,我不能坚持实体Payment
。我甚至试图将Sale
与Payment
(在prePersist方法$payment->setSale($this)
中)联系起来,希望EntityManager为我持续Payment
。 info from here - 我试图创建一个监听器(guided from here),但它只是不工作,在任何时候听者运行
- 做在我
SaleController::createAction()
,这种方式显然是简单的工作,但是这是什么优雅也违背了我的应用程序的良好设计,此操作是业务逻辑的一部分,并在各个部分重复使用。
答
在我列出的3种解决方案中,列出的3中的错误依然是最小的错误。这很简单,并不过分复杂,并且以后很容易重构。
但是,如果你正在寻找一个干净的解决方案,我认为你需要的是一个表单处理程序或类似的服务。 看看FOSUserBundle one。
基本上,您将在处理完所有销售表单内容后创建PaymentManager类&,将所有收集的信息传递给PaymentManager并让它处理Payment实体的所有创建/保留逻辑。
答
我建议@Inori建议的PaymentManager
是最好的方法,它是DRY,也是实体创建的中心点。它允许您将控制器中的所有用户输入进行编组,然后将其传递到管理器上,以正确构建对象Sale
。
,如果你希望去的选项,并使用生命周期回调我假设你得到的是说非托管实体是另一个实体上发现了异常 - 或东西的效果。为了解决这个问题,你可以级联上你的映射坚持这意味着你不需要调用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。
+1将工作委派给服务很简单,并且保持干爽。 – 2011-12-22 14:42:30