使用命令、事件或服务

Using Commands, Events or Services

在设计应用程序的后端时,您通常需要从实际执行任务的系统中抽象出执行任务的系统。

CQRS and PubSub 设计模式中有这样的元素。


举个例子:

(如果这没有意义请告诉我)


在我的应用程序中,我通常会:

虽然它们几乎完全相同,但我只是想知道 - 在创建应用程序架构时,您如何决定使用哪一个?

Fire a new Event that a Listener is set up to process Event::fire('user.new', $data)

事件模式意味着可能有许多处理程序订阅同一个事件,并且这些处理程序与发送者断开连接。此外,事件处理程序通常不会 return 向发送者发送信息(因为实际上可能有很多处理程序,并且对于向 return 发送谁的信息存在混淆)。

所以,这不是你的情况。

Create a new Command with the data, which is bound to a CommandHandler new NewUserCommand($data)

命令是执行某些操作的扩展方式。它们可以被分派、流水线化、排队等。如果您不需要所有这些功能,为什么要把事情复杂化?

Call a method in a Service and pass in the data UserService::newUser($data)

嗯,这是最适合你的情况,不是吗?

While these are nearly exactly the same, I am just wondering - how do you go about deciding which one to use when you are creating the architecture of your applications?

简单。从许多解决方案中只选择那些:

  • 比喻合适(不要使用事件,你的逻辑看起来不像事件)
  • 最简单的(不要太深入编程理论和方法的深度。总是选择解决方案,降低你的项目开发复杂度)

When to use command over event?

命令:当我有一些 单一 独立操作且几乎没有依赖时 必须 从不同的应用程序部分调用。最接近的类似物是一些编辑器命令,可以从工具栏和菜单访问。

事件:当我有几个(至少在透视中)依赖动作,这可能被称为before/after一些执行其他操作。例如,如果您有多个服务,则可以使用事件为它们执行缓存失效。更改特定对象的服务会发出 "IChangedObject" 事件。其他服务订阅此类事件并响应它们使其缓存无效。