美文网首页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