我正在使用Symfony2和Doctrine2开发中等规模的应用程序。我正在尝试尽可能根据SOLID原则构建我的代码。现在的问题是:
为了创建新实体,我使用带有代理对象的Symfony Forms,即:我不将表单直接绑定到我的实体,而是绑定到将传递给某些服务的其他类,这将采取所需的操作基于接收的数据,即:代理类充当该服务的DTO,我将其称为#FFFFFF
。现在考虑Handler
并不依赖于Handler
,我应该在哪里拨打EntityManager
和EntityManager::persist()
?我通常会把EntityManager::flush()
放在控制器中,但我对flush
不太确定,因为控制器不应该假设persist
做什么,也许{{1} (表单数据传递给的方法)不仅仅是将新实体持久保存到数据库中。一个想法是创建一些Handler
来封装Handler::handle
和interfaces
并传递它们,这将作为flush
和persist
周围的包装,但我'我不太确定,因为EntityManager::flush()
可能会造成不良后果。所以也许我应该围绕EntityManager::persist()
创建一个界面
所以,我的问题是在何处以及如何拨打EntityManager::flush()
和persist
,以获得最稳固的代码?或者我在寻求最佳实践方面过于复杂化了什么?
答案 0 :(得分:1)
如果你有一个能够处理你的实体任务的服务,对我而言,正确的方法是inject EntityManager进入你的服务定义并在其中保持并刷新操作。
如果你想保持单独的逻辑,另一种方法是创建一个EventSubscriber并在你准备好执行持久化和刷新操作时从你的“实体服务”中引发自定义事件
答案 1 :(得分:0)
我的2美分:
flush
,因为它称之为DB,就像你在控制器中需要的时候那样做对我来说听起来不错。presist
,当您的实体处于“准备好被刷新”状态时,应该在Handler
中调用它。只有Persister
方法作为persist
s依赖项的Handler
接口,以及注入其中的DoctrinePersister
实现看起来没问题。答案 2 :(得分:0)
这里的另一个选项-您可以在实体存储库类中实现save()
方法并在那里进行持久化。将实体存储库作为依赖项注入到Handler
类中。