在Symfony2中组织业务逻辑

在Symfony2中组织业务逻辑,symfony,Symfony,我正在将Symfony1应用程序转换为Symfony2,并尝试遵循Symfony2的最佳实践 我对业务逻辑有一个问题:在旧的应用程序中,所有的逻辑都在控制器中(非常胖的控制器)。我已经将其移动到实体存储库,但我不确定这是否是正确的方法(因为,除了其他事情,我需要发送电子邮件,但这不起作用) 例如,资源保留管理器(日历)的保存功能为: 开始交易 验证给定资源是否未在我试图保存的延时中使用 如果数据正确且资源标记为“强制确认”,则会向“确认者”组中的所有用户发送电子邮件 将向当前用户发送一封电子邮

我正在将Symfony1应用程序转换为Symfony2,并尝试遵循Symfony2的最佳实践

我对业务逻辑有一个问题:在旧的应用程序中,所有的逻辑都在控制器中(非常胖的控制器)。我已经将其移动到实体存储库,但我不确定这是否是正确的方法(因为,除了其他事情,我需要发送电子邮件,但这不起作用)

例如,资源保留管理器(日历)的保存功能为:

  • 开始交易
  • 验证给定资源是否未在我试图保存的延时中使用
  • 如果数据正确且资源标记为“强制确认”,则会向“确认者”组中的所有用户发送电子邮件
  • 将向当前用户发送一封电子邮件,告诉他资源已被正确保留(如果需要,还告诉“确认人”必须批准他的保留)
  • 如果一切正常,提交事务。如果发生任何错误,请回滚事务

如您所见,有很多业务逻辑(本例是其中一个较简单的模块),使用多种实体、用户、电子邮件发送者等。那么,我如何组织它呢?我应该将业务逻辑放在实体存储库中,还是使用服务更好?对于电子邮件,也许最好是从事件侦听器发送它们?你知道我在哪里可以找到一些关于这方面的例子吗?

只需制作服务来处理这些任务。例如创建一个可重复使用、可测试的服务,用于发送电子邮件。使API尽可能简单,然后可以在控制器中使用它

我的想法是,控制器只是在那里发送各种服务的信息,并处理输出给用户的内容。其他任何事情都应该通过服务以及这些服务的响应来控制

开小班并不是一件坏事——你的课程应该以做一件事为目标,把一件事做好。如果您将它们充分分离,那么它们将易于测试,并且易于重用

Symfony书籍是这方面的优秀资源:

你可能会发现马丁·福勒的这本书很有用。他说

一般来说,在服务中发现的行为越多,可能性就越大 您将失去域模型的好处。如果你所有的逻辑都在服务上,那你就把自己弄瞎了

我怀疑他和Eric Evans会使用DDD方法实现您的业务逻辑,方法如下

class Resource { public function isUsedIn(TimePeriod $tp); public function isMandatoryConfirmation(); } class ReservationManager { public function save(Resource $r, TimePeriod $tp) { if (! $r->isUsedIn($tp) || $r->isMandatoryConfirmation()) { // send email to all the users from the "confirmers" group // send email to the current user } } } 类资源 { 使用公共功能(时间段$tp); 公共职能是强制性确认(); } 类保留管理器 { 公共功能保存(资源$r,时段$tp) { 如果(!$r->isUsedIn($tp)|$r->IsMandatoryconfimation()){ //向“确认者”组中的所有用户发送电子邮件 //向当前用户发送电子邮件 } } } 不幸的是,根据我使用Symfony2的经验,这项工作还没有完成,代码最终进入了服务。承认业务逻辑可以放在条令实体中,但在我看来,这有点像黄鼠狼

服务具有容器意识,因此可以轻松访问其他服务以执行其他功能,如发送电子邮件、记录消息。条令条目不能访问其他服务,这意味着像Seer一样,在我们的项目中,我们最终使用服务


如果您喜欢将更多业务从服务中转移出去的想法,这并不困难,但Doctrine&Symfony似乎并不支持这种开箱即用的做法:-(

业务逻辑应该在服务、模型和数据库相关的东西中
实体存储
因此,据我所知,我必须创建一个服务,在服务中放置所有业务逻辑(检查资源是否已保留,插入新的保留,致电电子邮件服务通知保留是否需要批准,并致电电子邮件服务通知用户保留已保存),以及从此服务的控制器操作调用?尝试并拆分相关段。服务应专注于一件事。如果存在需要将来自一件“事”的数据传递到另一件“事”的点,则该数据属于您的控制器。但是,是的,听起来好像您得到了它:)