前言
本文主要給大家介紹了關(guān)于Laravel廣播模塊的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹:
注意:本文是基于Laravel 5.4版本的路由模塊代碼進(jìn)行分析書寫;
簡(jiǎn)介
廣播是指發(fā)送方發(fā)送一條消息,訂閱頻道的各個(gè)接收方都能及時(shí)收到消息;比如 A同學(xué)寫了一篇文章,這時(shí)候 B同學(xué)在文章底下評(píng)論了,A同學(xué)在頁面上是不用刷新就能收到提示有文章被評(píng)論了,這個(gè)本質(zhì)上就是A同學(xué)收到了廣播消息,這個(gè)廣播消息是由B同學(xué)評(píng)論這個(gè)動(dòng)作觸發(fā)了發(fā)送廣播消息;
在整個(gè)廣播行為中,有一個(gè)重要的概念叫頻道channel,頻道的類型有
- 公共頻道public
- 私有頻道private
- 存在頻道presence
移動(dòng)端訂閱了公共頻道public,會(huì)直接提示成功;私有頻道private和存在頻道presence在進(jìn)行訂閱的過程中,會(huì)向服務(wù)器端發(fā)送權(quán)限驗(yàn)證,看是不是有權(quán)限可以訂閱該頻道;私有頻道private和存在頻道presence的區(qū)別在于,私有頻道private能夠接收其他成員發(fā)送的消息,而存在頻道presence除此之外,還能夠在用戶的加入與離開時(shí)接收信息;
廣播適合以下場(chǎng)景:
- 通知(Notification) 或 信號(hào)(Signal)
- 通知是最簡(jiǎn)單的示例,也最經(jīng)常用到。信號(hào)也可看作是通知的一種展現(xiàn)形式,只不過信號(hào)沒有UI而已。
- Activity Streams
- Activity Streams(feeds)是社交網(wǎng)絡(luò)的核心。如微信朋友圈的點(diǎn)贊和評(píng)論,A可以實(shí)時(shí)看到B的點(diǎn)贊,B可以實(shí)時(shí)看到A的評(píng)論。
- 聊天
- 聊天信息的實(shí)時(shí)顯示
模塊組成
Demo
日志驅(qū)動(dòng)
配置
.env文件修改或添加一行:BROADCAST_DRIVER=log
;
廣播
直接調(diào)用
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $driver = $manager->connection(); // 第一個(gè)參數(shù)是頻道名,第二個(gè)參數(shù)是事件名,第三個(gè)參數(shù)是廣播內(nèi)容 $driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);
因?yàn)槭侨罩掘?qū)動(dòng),所以廣播內(nèi)容會(huì)寫到框架配置的日志文件中,輸出消息如下所示
[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload: { "message": "hello world" }
監(jiān)聽事件廣播
這種調(diào)用方式,是當(dāng)實(shí)現(xiàn)ShouldBroadcast接口的事件被觸發(fā)時(shí),則會(huì)進(jìn)行廣播操作;(同時(shí),還有一個(gè)接口叫ShouldBroadcastNow,與ShouldBroadcast接口的不同在于,將實(shí)現(xiàn)ShouldBroadcastNow接口的事件放入隊(duì)列中時(shí),會(huì)被放入叫sync的隊(duì)列中)
舉個(gè)例子,
第一步,Illuminate\Auth\Events\Login事件是用戶登錄成功后會(huì)觸發(fā)的事件,略作改動(dòng),讓其實(shí)現(xiàn)廣播功能;
class Login implements ShouldBroadcast { ...... // 定義事件被觸發(fā)時(shí),廣播頻道;此處定義名為 first-channel 的私有頻道 public function broadcastOn() { return [ new PrivateChannel('first-channel'), ]; } // 自定義廣播名稱;如果方法未定義,默認(rèn)以類名為事件名,此處的默認(rèn)值是 Illuminate\Auth\Events\Login public function broadcastAs() { return 'login'; } }
第二步,注冊(cè)事件監(jiān)聽;在app/Providers/EventServiceProvider.php中修改:
protected $listen = [ ...... 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\UserLogin', ], ];
文件app/Listeners/UserLogin.php粗糙地實(shí)現(xiàn)了一下:
class UserLogin { public function __construct() {} public function handle(Login $event){ \Log::info('Do UserLogin Listener: I was Login'); } }
第三步,觸發(fā)事件,發(fā)送廣播;有好幾種觸發(fā)廣播方式:
直接事件觸發(fā)
event(new Illuminate\Auth\Events\Login($user, true));
幫助函數(shù)broadcast,間接觸發(fā)事件
broadcast(new Illuminate\Auth\Events\Login($user, true));
廣播管理類,間接觸發(fā)事件,直接廣播
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->event(new Illuminate\Auth\Events\Login($user, true));