# EventDispatcher
事件派發,框架基礎,用于事件的傳遞。
## Event
Event是描述一個事件。
* type 事件類型
* data 事件內容
* fromInfo 消息來源方資料
* toInfo 消息接收方資料
* progress 派發的進度
我們通過new Event($type,$data)創建一個Event對象,額外方法:
* getType() 獲取類型
* getData() 獲取內容
* getProcessId() 獲取來源方的進程id
* getFromInfo($type) 獲取來源方的資料
* setFromInfo($type,$data) 設置來源方資料
* getToInfo($type) 獲取接收方資料
* setToInfo($type,$data) 設置接收方資料
* getProgress() 獲取進度
* setProgress($progress) 設置進度
## EventDispatcher
消息派發器
* addEventDispatcher(AbstractEventDispatcher $eventDispatcher) 添加一個派發器類型
* getEventDispatcher(string $name): ?AbstractEventDispatcher 獲取一個派發器類型
* listen($type, ?EventCall $eventCall = null, $once = false): EventCall 監聽事件返回EventCall ,once代表是否只是一次監聽
* remove($type, EventCall $eventCall) 移除某個類型的某個監聽
* removeAll($type = null) 移除某個類型的所有監聽
* dispatchEvent(Event $event) 派發事件,只在本進程
* dispatchProcessEvent(Event $event, Process ... $toProcess) 向某些進程派發事件
* dispatchProcessIdEvent(Event $event, $toProcessIds) 向某些進程派發事件
* getEventCalls($type): ?array 獲取某個類型的所有EventCall
項目中默認注冊了2種事件派發器,一是TypeEventDispatcher,另一個是ProcessEventDispatcher,派發器之間有嚴格的傳遞關系,傳遞進度會在Event中的progress表現出來,此外Event的toInfo對象決定使用哪種派發器。處理過程大概如下:
>事件生成過程
用戶調用setToInfo設置接收方資料
事件準備過程
TypeEventDispatcher調用setFromInfo寫入來源信息
ProcessEventDispatcher調用setFromInfo寫入來源信息
事件派發過程
ProcessEventDispatcher調用setToInfo讀取接受方信息 調用setProgress設置進度
TypeEventDispatcher調用setToInfo讀取接受方信息 調用setProgress設置進度
## EventCall
* call(callable $fuc) 一般通過這個方法接收事件
* wait($timeout = 5) 堵塞的接收事件
## 例子
獲取事件派發器
~~~
$eventDispatcher = Server::$instance->getEventDispatcher();
~~~
發出一個事件
~~~
$eventDispatcher->dispatchEvent(new ConfigChangeEvent());
~~~
監聽事件
~~~
$call = $eventDispatcher->listen(ConfigChangeEvent::ConfigChangeEvent);
$call->call(function (ConfigChangeEvent $result) {
});
~~~
- 前言
- 捐贈ESD項目
- 使用篇-通用
- 環境
- 安裝
- 規范
- 壓力測試
- 配置
- 如何設置YML配置
- server配置
- 端口配置
- 項目結構
- 事件派發
- 日志
- 注解
- DI容器
- 自定義進程
- 并發及協程池
- Console插件
- Scheduled插件
- Redis插件
- AOP插件
- Saber插件
- Mysql插件
- mysql事務
- Actuator插件
- Whoops插件
- Cache插件
- PHPUnit插件
- Security插件
- Session插件
- EasyRoute插件
- http路由
- ProcessRpc插件
- AutoReload插件
- AnnotationsScan插件
- Tracing-plugin插件
- MQTT插件
- Pack插件
- AMQP插件
- Validate插件
- Uid插件
- Topic插件
- Blade插件
- CsvReader插件
- hashed-wheel-timer-plugin插件
- 使用篇-HTTP
- 路由
- 靜態文件
- 路由定義
- 修飾方法
- 路由分組
- 資源路由
- 端口作用域
- 異常處理
- 跨域請求
- 路由緩存
- 控制器
- 控制器初始化
- 前置操作
- 跳轉和重定向
- 異常處理
- 請求
- 請求對象
- 請求信息
- request消息
- response消息
- stream消息
- url接口
- 驗證器
- 內置驗證器
- 內置過濾器
- 使用篇-WS
- 如何使用
- 路由
- 使用篇-TCP
- 插件篇-PluginSystem
- 微服務篇-ESDCloud
- CircuitBreaker插件
- SaberCloud插件
- 分布式鏈路追蹤系統
- Consul插件