《PHP教程:Laravel學習教程之廣播模塊詳解》要點:
本文介紹了PHP教程:Laravel學習教程之廣播模塊詳解,希望對您有用。如果有疑問,可以聯系我們。
前言PHP實戰
本文主要給大家介紹了關于Laravel廣播模塊的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:PHP實戰
注意:本文是基于Laravel 5.4版本的路由模塊代碼進行分析書寫;PHP實戰
簡介
PHP實戰
廣播是指發送方發送一條消息,訂閱頻道的各個接收方都能及時收到消息;比如 A同學寫了一篇文章,這時候 B同學在文章底下評論了,A同學在頁面上是不用刷新就能收到提示有文章被評論了,這個本質上就是A同學收到了廣播消息,這個廣播消息是由B同學評論這個動作觸發了發送廣播消息;PHP實戰
在整個廣播行為中,有一個重要的概念叫頻道channel,頻道的類型有PHP實戰
移動端訂閱了公共頻道public,會直接提示成功;私有頻道private和存在頻道presence在進行訂閱的過程中,會向服務器端發送權限驗證,看是不是有權限可以訂閱該頻道;私有頻道private和存在頻道presence的區別在于,私有頻道private能夠接收其他成員發送的消息,而存在頻道presence除此之外,還能夠在用戶的加入與離開時接收信息;PHP實戰
廣播適合以下場景:PHP實戰
模塊組成PHP實戰
PHP實戰
Demo
PHP實戰
日志驅動
PHP實戰
配置
PHP實戰
.env文件修改或添加一行:BROADCAST_DRIVER=log
;PHP實戰
廣播
PHP實戰
直接調用PHP實戰
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $driver = $manager->connection(); // 第一個參數是頻道名,第二個參數是事件名,第三個參數是廣播內容 $driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);
因為是日志驅動,所以廣播內容會寫到框架配置的日志文件中,輸出消息如下所示PHP實戰
[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload: { "message": "hello world" }
監聽事件廣播
PHP實戰
這種調用方式,是當實現ShouldBroadcast接口的事件被觸發時,則會進行廣播操作;(同時,還有一個接口叫ShouldBroadcastNow,與ShouldBroadcast接口的不同在于,將實現ShouldBroadcastNow接口的事件放入隊列中時,會被放入叫sync的隊列中)PHP實戰
舉個例子,PHP實戰
第一步,Illuminate\Auth\Events\Login事件是用戶登錄成功后會觸發的事件,略作改動,讓其實現廣播功能;PHP實戰
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中修改:PHP實戰
protected $listen = [ ...... 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\UserLogin', ], ];
文件app/Listeners/UserLogin.php粗糙地實現了一下:PHP實戰
class UserLogin { public function __construct() {} public function handle(Login $event){ \Log::info('Do UserLogin Listener: I was Login'); } }
第三步,觸發事件,發送廣播;有好幾種觸發廣播方式:PHP實戰
直接事件觸發
PHP實戰
event(new Illuminate\Auth\Events\Login($user, true));
幫助函數broadcast,間接觸發事件
PHP實戰
broadcast(new Illuminate\Auth\Events\Login($user, true));
廣播管理類,間接觸發事件,直接廣播
PHP實戰
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->event(new Illuminate\Auth\Events\Login($user, true));
廣播管理類,間接觸發事件,放入隊列
PHP實戰
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->queue(new Illuminate\Auth\Events\Login($user, true));
Pusher驅動
PHP實戰
Pusher是一個第三方服務,服務器發送廣播時,會向Pusher發送請求,再通過Pusher與瀏覽器或移動端保持的長連接進行數據交互;PHP實戰
配置
PHP實戰
通過Pusher官網注冊用戶信息,獲取屬于自已的一套密鑰信息,修改.env的配置文件;PHP實戰
BROADCAST_DRIVER=pusher PUSHER_APP_ID=xxxxxxxxxxxxxxxxxxxxxx PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxxxx PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx
準備工作
PHP實戰
事件監聽PHP實戰
后臺的事件監聽還是采用"日志驅動"部分的登錄例子;PHP實戰
前端PHP實戰
前端頁面引入以下代碼:PHP實戰
<script src="https://js.pusher.com/4.1/pusher.min.js"></script> <script> // 打開 Pusher 的調試日志 Pusher.logToConsole = true; // 定義 Pusher 變量 var pusher = new Pusher('PUSHER_APP_KEY的值', { cluster: 'ap1', encrypted: true }); // 定義頻道,綁定事件 var channel = pusher.subscribe('private-first-channel'); channel.bind('login', function(data) { alert(data); }); </script>
如果訂閱的是公共頻道,則不會向服務器端請求權限檢查;如果是私有頻道(頻道名是以private-開頭)或存在頻道(頻道名是以presence-開頭),則會發出權限檢查請求;對應的后端需要定義私有頻道和存在頻道的權限;PHP實戰
頻道權限定義PHP實戰
頻道的權限定義是在routes/channels.php里;此處筆者為first-channel頻道定義權限回調函數:PHP實戰
Broadcast::channel('first-channel', function ($user) { return (int) $user->id === 1; });
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/251.html