如果当前用户,发送的消息只想让指定的用户看到,也就是私聊这个功能。在GatewayWorker中实现起来,其实也是很简单的。

先修改下vue部分,找到私聊部分的html代码

<select class="form-control" id="user_id" v-model="user_id">
    <!-- ... -->
</select>
return {
    user_id: ''
}
onSubmit() {
    axios.post('/say', {content: this.content, user_id: this.user_id})
    this.content = ''
}

这样,当在下拉列表中选择某一个用户后,就会将当前的user_id发送给php了

controller

use App\User;
public function say(Request $request)
{
    $data = [
        //...
    ];

    //私聊
    if ($request->user_id) {
        $data['data']['name'] = Auth::user()->name . ' 对 ' . User::find($request->user_id)->name . ' 说:';
        Gateway::sendToUid($request->user_id, json_encode($data));
        Gateway::sendToUid(Auth::id(), json_encode($data));

        //私聊信息,只发给对应用户,不存数据库了
        return;
    }

    Gateway::sendToAll(json_encode($data));

    //...
}

大家仔细想一下私聊的流程,其实就是先发给指定的用户,然后再发给自己。这不就是了吗?所以我们这里写两个sendToUid

现在开启三个浏览器,或者chrome中,新建三个用户也行。来私聊试试