美文网首页PHP经验分享PHP开发
SWOOLE开发实时聊天系统(七)通过观察者模式实现通知

SWOOLE开发实时聊天系统(七)通过观察者模式实现通知

作者: 公式般欢笑 | 来源:发表于2020-03-10 00:05 被阅读0次

用户订阅的流程分为三步
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,接下来我们可以直接在业务中,调用通知方法了。

相关文章

网友评论

    本文标题:SWOOLE开发实时聊天系统(七)通过观察者模式实现通知

    本文链接:https://www.haomeiwen.com/subject/mrpqdhtx.html