ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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) { }); ~~~