SWOOLE開發(fā)實時聊天系統(tǒng)(七)通過觀察者模式實現(xiàn)通知

用戶訂閱的流程分為三步
1.根據(jù)用戶發(fā)送的json數(shù)據(jù)的type判斷消息類型。
2.如果是登錄用戶,就將用戶的信息存儲到redis中。
3.返回給用戶一個登錄成功的狀態(tài)。
4.通知所有用戶“xxx”進入了直播。

在app目錄下,一共有兩個目錄,一個是controllers,負責(zé)數(shù)據(jù)的收發(fā),一個是services,負責(zé)具體邏輯的處理。

├── app
│   ├── controllers
│   └── services

在services目錄下新建push文件夾,所有通知推送相關(guān)的服務(wù)全部寫在該文件夾中。

第一、新建app/services/push/PushObServer.php文件,用來規(guī)定消息通知的接口。

<?php
namespace app\services\push;
interface PushObServer
{
    function update();
}

第二、新建一個通知當(dāng)前用戶注冊是否成功的類,app/services/push/PushToSelfRegisterInfo,這個類用來繼承Interface接口,實現(xiàn)其中的方法。
同樣,我們需要創(chuàng)建一個給其他用戶發(fā)消息的類,以便通知其他用戶“xxx進入了房間”。

//注冊結(jié)果通知類
<?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;
    }
}


//給其他用戶發(fā)消息的類。
<?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類中一共有兩個方法,第一個方法是將當(dāng)前所有的通知都存放到$events這個數(shù)組中,第二個方法是執(zhí)行通知的具體方法,取出所有的需要通知的內(nèi)容,執(zhí)行其中的update方法。
OK,接下來我們可以直接在業(yè)務(wù)中,調(diào)用通知方法了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、iOS 直播聊天室 Demo 說明 1、源碼結(jié)構(gòu) 2、AppDelegate 在 AppDelegate 中初...
    ajiao焦閱讀 2,994評論 2 7
  • 網(wǎng)上介紹iOS Push的文章有很多,但是大部分都總結(jié)得非常零散,加上之前也一直沒好好總結(jié)過,對某些地方也不求甚解...
    紙簡書生閱讀 2,988評論 1 29
  • 出租車司機師傅談家庭成員矛盾問題語了句,敵人的敵人就是朋友,應(yīng)付個家庭矛盾都上升到階級斗爭,你死我活的敵人概念,真...
    縱情嬉戲天地間閱讀 159評論 0 0
  • 今天的組會上老板有催paper了,其實他已經(jīng)一再妥協(xié)一推再推了。是我自己沒有能夠抓緊時間。好好反思一下,時間都是我...
    守護者_eb3a閱讀 136評論 0 0
  • 第五回中,在金陵十二釵副冊中有香菱的判詞: 根并荷花一莖香,平生遭際實堪傷。自從兩地生孤木,致使香魂返故鄉(xiāng)。 香菱...
    月動黃昏閱讀 377評論 0 1

友情鏈接更多精彩內(nèi)容