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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、iOS 直播聊天室 Demo 说明 1、源码结构 2、AppDelegate 在 AppDelegate 中初...
    ajiao焦阅读 2,901评论 2 7
  • 网上介绍iOS Push的文章有很多,但是大部分都总结得非常零散,加上之前也一直没好好总结过,对某些地方也不求甚解...
    纸简书生阅读 2,876评论 1 29
  • 出租车司机师傅谈家庭成员矛盾问题语了句,敌人的敌人就是朋友,应付个家庭矛盾都上升到阶级斗争,你死我活的敌人概念,真...
    纵情嬉戏天地间阅读 141评论 0 0
  • 今天的组会上老板有催paper了,其实他已经一再妥协一推再推了。是我自己没有能够抓紧时间。好好反思一下,时间都是我...
    守护者_eb3a阅读 120评论 0 0
  • 第五回中,在金陵十二钗副册中有香菱的判词: 根并荷花一茎香,平生遭际实堪伤。自从两地生孤木,致使香魂返故乡。 香菱...
    月动黄昏阅读 316评论 0 1