think-swoole v3.1 socket.io 自定义事
2021-02-21 本文已影响0人
HyperLifelll9
在
think-swoole v3.1
更新中,改进了socket.io
事件的触发方式,之前注册的自定义的socket.io
事件监听配置将全部失效。
翻阅源码(think\swoole\websocket\socketio\Handler.php
)后可以发现:
对于自定义的 socket.io
事件,新版的 think-swoole
将不会帮我们自动触发,而是将这些自定义事件的相关数据集中发射到了 swoole.websocket.Event
事件中:
case Packet::EVENT:
[$type, $data] = $packet->data;
result = $this->event->trigger('swoole.websocket.Event', ['type' => $type, 'data' => $data]);
if ($packet->id !== null) {
$responsePacket = Packet::create(Packet::ACK, [
'id' => $packet->id,
'nsp' => $packet->nsp,
'data' => $result,
]);
$this->push($responsePacket);
}
break;
其中 $type
为事件名,$data
为该事件所携带的数据。
知道原因后,我们可以自己动手实现一个 socket.io
自定义事件分发器,自行触发自定义的 socket.io
事件:
- 编写一个事件监听器:
<?php
declare(strict_types=1);
namespace app\listener\websocket;
use app\core\Result;
use think\facade\Event;
use think\helper\Str;
class SocketEventDispatcher
{
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event)
{
['type' => $type, 'data' => $data] = $event;
// 自行触发事件
// 为了防止事件名冲突,添加 swoole.websocket.Event. 前缀
Event::trigger('swoole.websocket.Event.' . Str::studly($type), $data);
}
}
2.1. 注册事件监听器(方式一:event.php):
...
'swoole.websocket.Event' => [SocketEventDispatcher::class],
'swoole.websocket.Event.CustomEvent' => [CustomEvent::class],
...
2.2. 注册事件监听器(方式二:config/swoole.php):
...
'listen' => [
'Event' => SocketEventDispatcher::class,
'Event.CustomEvent' => CustomEvent::class,
]
...