Hyperf-Socket.io实现私聊
部分代码
鉴权
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 协议》,转载必须注明作者和本文链接