From 3475c4940303bc47876386481f1f2e21f6d6091b Mon Sep 17 00:00:00 2001 From: huangzhhui Date: Fri, 22 Mar 2019 16:27:35 +0800 Subject: [PATCH] Update event.md --- zh/event.md | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/zh/event.md b/zh/event.md index e69de29bb..5d0655cc0 100644 --- a/zh/event.md +++ b/zh/event.md @@ -0,0 +1,122 @@ +# 事件机制 + +## 前言 + +事件模式必须基于 [PSR-14](https://github.com/php-fig/fig-standards/blob/master/proposed/event-dispatcher.md) 去实现,由于该 PSR 仍处于 `Review` 状态,则这里指的版本为 `0.7` 版。 +Hyperf 的事件管理器默认由 [hyperf/event](https://github.com/hyperf-cloud/event) 实现,该组件亦可用于其它框架或应用,只需通过 Composer 将该组件引入即可。 +```bash +composer require hyperf/event +``` + +## 概念 + +事件模式是一种经过了充分测试的可靠机制,是一种非常适用于解耦的机制,分别存在以下 3 种角色: + +- `事件(Event)` 是传递于应用代码与 `监听器(Listener)` 之间的通讯对象 +- `监听器(Listener)` 是用于监听 `事件(Event)` 的发生的监听对象 +- `调度器(Dispatcher)` 是用于触发 `事件(Event)` 和管理 `监听器(Listener)` 与 `事件(Event)` 之间的关系的管理者对象 + +用通俗易懂的例子来说明就是,假设我们存在一个 `UserService::register()` 方法用于注册一个账号,在账号注册成功后我们可以通过调度器触发 `UserRegistered` 事件,由监听器监听该事件的发生,在触发时进行某些操作,比如发送用户注册成功短信,在业务发展的同时我们可能会希望在用户注册成功之后做更多的事情,比如发送用户注册成功的邮件等待,此时我们就可以通过再增加一个监听器监听 `UserRegistered` 事件即可,无需在 `UserService::regisgter()` 方法内部增加与之无关的代码。 + +## 使用事件管理器 + +### 定义一个事件 + +一个事件其实就是一个用于管理状态数据的普通类,触发时将应用数据传递到事件里,然后监听器对事件类进行操作,一个事件可被多个监听器监听。 + +```php +user = $user; + } +} +``` + +### 定义一个监听器 + +监听器都需要实现一下 `Hyperf\Event\Contract\ListenerInterface` 接口的约束方法,示例如下。 + +```php + 使用 `@Listener` 注解时需 `use Hyperf\Event\Annotation\Listener;` 命名空间; + +### 触发事件 +