应该在哪里调用EntityManager :: persist()和EntityManager :: flush()

时间:2015-08-17 11:12:14

标签: symfony soa solid-principles

我正在使用Symfony2和Doctrine2开发中等规模的应用程序。我正在尝试尽可能根据SOLID原则构建我的代码。现在的问题是:
为了创建实体,我使用带有代理对象的Symfony Forms,即:我不将表单直接绑定到我的实体,而是绑定到将传递给某些服务的其他类,这将采取所需的操作基于接收的数据,即:代理类充当该服务的DTO,我将其称为#FFFFFF。现在考虑Handler并不依赖于Handler,我应该在哪里拨打EntityManagerEntityManager::persist()?我通常会把EntityManager::flush()放在控制器中,但我对flush不太确定,因为控制器不应该假设persist做什么,也许{{1} (表单数据传递给的方法)不仅仅是将新实体持久保存到数据库中。一个想法是创建一些Handler来封装Handler::handleinterfaces并传递它们,这将作为flushpersist周围的包装,但我'我不太确定,因为EntityManager::flush()可能会造成不良后果。所以也许我应该围绕EntityManager::persist()创建一个界面 所以,我的问题是在何处以及如何拨打EntityManager::flush()persist,以获得最稳固的代码?或者我在寻求最佳实践方面过于复杂化了什么?

3 个答案:

答案 0 :(得分:1)

如果你有一个能够处理你的实体任务的服务,对我而言,正确的方法是inject EntityManager进入你的服务定义并在其中保持并刷新操作。

如果你想保持单独的逻辑,另一种方法是创建一个EventSubscriber并在你准备好执行持久化和刷新操作时从你的“实体服务”中引发自定义事件

答案 1 :(得分:0)

我的2美分:

  • 关于flush,因为它称之为DB,就像你在控制器中需要的时候那样做对我来说听起来不错。
  • 关于presist,当您的实体处于“准备好被刷新”状态时,应该在Handler中调用它。只有Persister方法作为persist s依赖项的Handler接口,以及注入其中的DoctrinePersister实现看起来没问题。

答案 2 :(得分:0)

这里的另一个选项-您可以在实体存储库类中实现save()方法并在那里进行持久化。将实体存储库作为依赖项注入到Handler类中。