用户订阅的流程分为三步
1.根据用户发送的json数据的type判断消息类型。
2.如果是登录用户,就将用户的信息存储到redis中。
3.返回给用户一个登录成功的状态。
4.通知所有用户“xxx”进入了直播。
在app目录下,一共有两个目录,一个是controllers,负责数据的收发,一个是services,负责具体逻辑的处理。
├── app
│ ├── controllers
│ └── services
在services目录下新建push文件夹,所有通知推送相关的服务全部写在该文件夹中。
第一、新建app/services/push/PushObServer.php文件,用来规定消息通知的接口。
<?php
namespace app\services\push;
interface PushObServer
{
function update();
}
第二、新建一个通知当前用户注册是否成功的类,app/services/push/PushToSelfRegisterInfo,这个类用来继承Interface接口,实现其中的方法。
同样,我们需要创建一个给其他用户发消息的类,以便通知其他用户“xxx进入了房间”。
//注册结果通知类
<?php
namespace app\services\push;
use app\services\CommonService;
class PushToSelfRegisterInfo extends PushCommonService implements PushObServer
{
protected $server;
protected $msg;
protected $fds;
public function __construct(\swoole_websocket_server $server,$msg, $fds)
{
$this->server=$server;
$this->msg=$msg;
$this->fds=$fds;
}
public function update()
{
$this->result['msg'] = $this->msg;
$params = json_encode($this->result, JSON_UNESCAPED_UNICODE);
if(!$this->fds){
return false;
}
foreach ($this->fds as $fd) {
$this->server->push($fd, $params);
}
return true;
}
}
//给其他用户发消息的类。
<?php
namespace app\services\push;
class PushToAllMessage extends PushCommonService implements PushObServer
{
private $server;
private $msg;
private $fds;
public function __construct(\swoole_websocket_server $server,$data, $fds)
{
$this->server=$server;
$this->result['data']=$data;
$this->fds=$fds;
}
/**
* @inheritDoc
*/
function update()
{
$params = json_encode($this->result, JSON_UNESCAPED_UNICODE);
if(!$this->fds){
return false;
}
foreach ($this->fds as $fd) {
$this->server->push($fd, $params);
}
return true;
}
}
这个类的作用是在用户注册成功之后,给用户自己返回一个注册成功与否的信息。
第三、新建一个抽象类app/services/push/PushEventGenerator,用于接收新增的消息通知类型。
<?php
namespace app\services\push;
abstract class PushEventGenerator
{
protected $events=[];
public function addPushObServer(PushObServer $obServer){
$this->events[]=$obServer;
}
public function notify(){
foreach($this->events as $event){
$event->update();
}
}
}
PushEventGenerator类中一共有两个方法,第一个方法是将当前所有的通知都存放到$events这个数组中,第二个方法是执行通知的具体方法,取出所有的需要通知的内容,执行其中的update方法。
OK,接下来我们可以直接在业务中,调用通知方法了。
网友评论