Hyperf-Socket.io实现私聊

gitee地址

:point_down:部分代码

鉴权

class WebSocketAuthMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        // 伪代码,通过 isAuth 方法拦截握手请求并实现权限检查
        if (! $this->isAuth($request)) {
            throw new WebsocketException(401, 'auth faild');
        }
        return $handler->handle($request);
    }

    public function isAuth($request)
    {
        $params = $request->getQueryParams();

        $user = User::query()
            ->where('token', $params['token'])
            ->first();
        if (!$user)
            return false;
        $request = Context::get(ServerRequestInterface::class);
        $request = $request->withAttribute('user', $user);
        Context::set(ServerRequestInterface::class, $request);
        return true;
    }
}

控制器

/**
 * @SocketIONamespace("/")
 */
class WebSocketController extends BaseNamespace
{
    /**
     * @Inject 
     * @var EventDispatcherInterface
     */
    private $eventDispatcher;

    /**
     * @Event("connect")
     */
    public function connect(Socket $socket)
    {
        $user = $socket->getRequest()->getAttribute('user');
        // 这里 dispatch(object $event) 会逐个运行监听该事件的监听器
        $this->eventDispatcher->dispatch(new SocketIoConnect($user, $socket->getSid()));
    }

    /**
     * @Event("disconnect")
     */
    public function disconnect(Socket $socket)
    {
        $user = $socket->getRequest()->getAttribute('user');
        // 这里 dispatch(object $event) 会逐个运行监听该事件的监听器
        $this->eventDispatcher->dispatch(new SocketIoDisConnect($user));
    }

    /**
     * @Event("say")
     * @param string $data
     */
    public function onSay(Socket $socket, $data)
    {
        // 这里 dispatch(object $event) 会逐个运行监听该事件的监听器
        $this->eventDispatcher->dispatch(new UserChat($data));
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!