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