Symfony 应在何处调用EntityManager::persist()和EntityManager::flush()

Symfony 应在何处调用EntityManager::persist()和EntityManager::flush(),symfony,soa,solid-principles,Symfony,Soa,Solid Principles,我正在使用Symfony2和Doctrine2开发一个中等规模的应用程序。我正在尽可能地根据坚实的原则来构造代码。现在有一个问题: 为了创建新的实体,我使用带有代理对象的Symfony表单,即:我不将表单直接绑定到我的实体,而是绑定到某个其他类,该类将传递给某个服务,该服务将根据接收到的数据采取所需的操作,即:代理类用作该服务的DTO,我将调用处理程序。现在考虑到处理程序不依赖于EntityManager,我应该在哪里调用EntityManager::persist()和EntityManage

我正在使用Symfony2和Doctrine2开发一个中等规模的应用程序。我正在尽可能地根据坚实的原则来构造代码。现在有一个问题:
为了创建新的实体,我使用带有代理对象的Symfony表单,即:我不将表单直接绑定到我的实体,而是绑定到某个其他类,该类将传递给某个服务,该服务将根据接收到的数据采取所需的操作,即:代理类用作该服务的DTO,我将调用
处理程序
。现在考虑到
处理程序
不依赖于
EntityManager
,我应该在哪里调用
EntityManager::persist()
EntityManager::flush()
?我通常对将
flush
放入控制器很满意,但对于
persist
我不太确定,因为控制器不应该假设
处理程序的功能,可能还有
Handler::handle
(表单数据传递到的方法)不仅仅是将新实体持久化到数据库。一个想法是创建一些
接口
来封装
flush
persist
并传递它们,它们将充当
EntityManager::flush()
EntityManager::persist()
的包装器,但我不太确定,因为
EntityManager::flush()
可能会造成不必要的后果。所以也许我应该创建一个关于
持久化
的接口

因此,我的问题是在哪里以及如何调用
persist
flush
,以获得最可靠的代码?或者我只是在寻求最佳实践的过程中把事情复杂化了?

如果您有一个服务可以处理实体上的任务,对我来说,正确的方法是将EntityManager放入您的服务定义中,并在其中执行持久化和刷新操作

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

  • 关于
    flush
    ,正如它所说的DB,在需要控制器时,像您已经做过的那样做对我来说很好
  • 关于
    presist
    ,当实体处于“准备刷新”状态时,应在
    处理程序中调用它。一个
    Persister
    接口,其中只有
    persist
    方法作为
    处理程序的依赖项,并且在其中注入了
    DoctrinePersister
    实现,看起来还可以

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

正如我所说,我不想将我的服务与整个EntityManager耦合,但我确实喜欢基于事件的想法。@user2268997:我之所以提到它,是因为,如果服务的目的是将一些逻辑应用于对象并将其持久化,由于持久化和刷新是其他地方定义的小型操作,因此它可能是一个很好的折衷方案:有时只是为了遵循“黄金法则”,我们倾向于开发不必要的操作solutions@user2268997:ps您需要dispatcher而不是实体管理器,因此您将被迫在某个点注入某些内容;)这与你注入了多少东西无关,否则你只需要到处注入服务容器,然后用它做任何你想做的事情。然而,使用事件处理东西总是需要一个真正有组织的代码库和大量文档。否则,这个项目就会以散落在各处的一小块意大利面而告终,这实际上比在一个地方放很多意大利面更糟糕。@user2268997:我完全理解你在这里说的话。顺便说一句,我的观察在某种程度上仍然有效:)