事件处理器--PHP

95 阅读3分钟

事件处理 - PHP

John被指派处理用户注册问题。他想避免这个问题,因为这个代码的复杂程度与此有关。他在这个项目中工作了两年,他已经修复了好几次,但是每当他打开代码时,他就像第一次看到它。

约翰选择了任何其他问题,把注册问题拖延到最后一刻。每当他的上司问起这个问题时,他都会汗流浃背。因此,几天后,他决定重构代码,以使他的工作更容易。

你是否曾经在代码上做过_很多工作,以至于改变它是很可怕的_?或者每当你打开它的时候,你是否从头分析过

这往往来自于充满子流程的代码,这些流程已经与主流程合并了**。**

主流程和子流程

在注册的情况下**,主流程是创建一个用户并将其保存到数据库中。
另一方面流程
可能是**:
- 发送欢迎或确认电子邮件
- 创建关于用户注册的审计日志
- 将注册用户同步到外部服务

medium.com/media/5cf5e…

如果我们把注册(创建和保存用户)看作是主流程,子流程的发生是主流程成功的结果

那么,我们如何判断主流程是成功的呢?
我们是通过_事件_来实现的。

事件描述的是过去发生的事情。在注册的情况下,它将是_用户被注册。_
通过订阅事件,我们能够运行任何子流程。

发布和订阅事件

安装

让我们从定义Event类开始。

medium.com/media/5e8fe…

是一个没有任何框架相关接口或抽象类的类。.

我们将使用事件总线从_PersonRegistrationService_ 发布PersonWasRegistered事件

medium.com/media/865a7…

在安装Ecotone后,事件总线被自动注册在依赖容器中。

我们现在可以将所有的逻辑转移到事件处理程序,订阅特定的事件。

medium.com/media/cd259…

事件处理程序事件处理程序根据第一个参数类型提示订阅特定事件。.

我们在这里使用了一个包含三个事件处理程序的单一类。如果你觉得有必要,你可以为每个事件处理程序创建单独的类。

你可以注意到,我们直接将特定的服务注入到事件处理程序的方法中。

medium.com/media/a5f82…

这是由于Ecotone的方法调用机制而实现的。你可以将任何服务传递给给定的_命令/事件/查询处理程序的_方法,Ecotone将通过为你注入这些服务来完成工作**。**

快乐的约翰

John现在确信,分离子流程将使他的代码更加可读、可测试和可靠。
他看到,现在改变给定功能的代码只会影响给定流程。他能想到更容易的测试,因为他可以单独和隔离地测试事件处理程序。
而且他确信,当新的子流程到来时,团队将更容易维护代码

如果你想了解更多关于事件处理的信息,请关注Ecotone的文档


事件处理--PHP》最初发表在《Nerd For Tech》杂志上,人们通过强调和回应这个故事来继续对话。