使用命令、事件或服务
Using Commands, Events or Services
在设计应用程序的后端时,您通常需要从实际执行任务的系统中抽象出执行任务的系统。
举个例子:
- 新用户提交注册表
- 您的应用程序收到该数据并推出一条消息说
“hey i have some new user data, please do something with this”
- 侦听器/处理程序/服务获取数据并对其进行处理
(如果这没有意义请告诉我)
在我的应用程序中,我通常会:
- 触发监听器设置为处理的新事件
Event::fire('user.new', $data)
- 使用绑定到 CommandHandler 的数据创建一个新命令
new NewUserCommand($data)
- 调用Service中的方法并传入数据
UserService::newUser($data)
虽然它们几乎完全相同,但我只是想知道 - 在创建应用程序架构时,您如何决定使用哪一个?
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" 事件。其他服务订阅此类事件并响应它们使其缓存无效。
在设计应用程序的后端时,您通常需要从实际执行任务的系统中抽象出执行任务的系统。
举个例子:
- 新用户提交注册表
- 您的应用程序收到该数据并推出一条消息说
“hey i have some new user data, please do something with this”
- 侦听器/处理程序/服务获取数据并对其进行处理
(如果这没有意义请告诉我)
在我的应用程序中,我通常会:
- 触发监听器设置为处理的新事件
Event::fire('user.new', $data)
- 使用绑定到 CommandHandler 的数据创建一个新命令
new NewUserCommand($data)
- 调用Service中的方法并传入数据
UserService::newUser($data)
虽然它们几乎完全相同,但我只是想知道 - 在创建应用程序架构时,您如何决定使用哪一个?
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" 事件。其他服务订阅此类事件并响应它们使其缓存无效。