# Laravel 11 使用 Pusher Channels 實現廣播功能完整教程 在現代的網頁應用中,實時通信已成為提升用戶體驗的關鍵元素。`Laravel` 提供了強大的廣播系統,可以輕鬆地將服務器端的事件實時推送到客戶端。本文將詳細介紹如何在 `Laravel 11` 中使用 `Pusher Channels` 來實現廣播功能。 ## 前言 [Laravel 的廣播系統](https://laravel.com/docs/11.x/broadcasting)允許您在應用程序中輕鬆地實現實時功能,如聊天、通知等。`Pusher` 是一個托管的 `WebSocket` 平台,可以與 `Laravel` 無縫整合,使實時通信更加簡單。 ## 環境準備 * Laravel 版本:11.x * PHP 版本:需要滿足 Laravel 11 的要求 * Node.js 和 NPM:用於安裝前端依賴 * [Pusher 帳戶](https://dashboard.pusher.com/):需要在 Pusher 官方網站註冊一個帳戶 ## 安裝與配置 ### 安裝 Laravel Broadcasting 首先,按照官方文檔的指示,安裝 `Laravel` 的廣播組件: ```bash= php artisan install:broadcasting ``` ### 安裝 Pusher PHP SDK 接下來,安裝 Pusher 的 PHP 服務器端 SDK: ```bash= composer require pusher/pusher-php-server ``` ### 配置 .env 檔案 在 .env 檔案中,設置廣播驅動為 `pusher`: ```makefile= BROADCAST_CONNECTION=pusher ``` 接著,添加 `Pusher` 的相關配置: ```makefile= PUSHER_APP_ID=your-pusher-app-id PUSHER_APP_KEY=your-pusher-key PUSHER_APP_SECRET=your-pusher-secret PUSHER_HOST= PUSHER_PORT=443 PUSHER_SCHEME=https PUSHER_APP_CLUSTER=ap3 VITE_APP_NAME="${APP_NAME}" VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" ``` 請確保將 `your-pusher-app-id`、`your-pusher-key` 和 `your-pusher-secret` 替換為您在 `Pusher` 服務中獲取的實際值。 注意:`PUSHER_APP_CLUSTER` 的值需要與您在 `Pusher` 控制台中選擇的集群相匹配。例如,如果您選擇了東京(ap3),則需要設置為 `ap3`。 ![1726728419134](https://hackmd.io/_uploads/S1BbKHKaR.jpg) ## 安裝客戶端套件 ### 安裝 Laravel Echo 和 Pusher JS 在客戶端,我們需要安裝 laravel-echo 和 pusher-js: ```bash= npm install --save-dev laravel-echo pusher-js ``` ### 配置客戶端 JavaScript 創建一個新的文件 resources/js/echo.js,並添加以下內容: ```javascript= import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; // 開啟 Pusher 日誌(開發環境) Pusher.logToConsole = true; window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_PUSHER_APP_KEY, cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER, forceTLS: true, }); ``` 在 `resources/js/bootstrap.js` 中導入剛才的 `echo.js`: ```javascript= import './echo'; ``` ## 創建事件並廣播 ### 創建廣播事件 使用 Artisan 命令創建一個新的事件: ```bash= php artisan make:event MyEvent ``` 在生成的 `app/Events/MyEvent.php` 中,確保該事件實現了 `ShouldBroadcast` 接口: ```php= <?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class MyEvent implements ShouldBroadcast { use Dispatchable, SerializesModels; public $message; public function __construct($message) { $this->message = $message; } public function broadcastOn() { return new Channel('my-channel'); } public function broadcastAs() { return 'my-event'; } } ``` ### 觸發事件 在路由中添加一個測試路由,用於觸發事件: ```php= use App\Events\MyEvent; Route::get('/test-broadcast', function () { event(new MyEvent('這是一條測試廣播訊息')); return '事件已觸發'; }); ``` ## 客戶端接收廣播 在您的前端應用中,添加以下代碼來監聽廣播事件。假設您在一個 Vue 組件中: ```javascript= mounted() { Echo.channel('my-channel') .listen('my-event', (e) => { console.log('收到廣播訊息:', e); }); } ``` 現在,當您訪問 `/test-broadcast` 路由時,客戶端應該能夠在控制台中看到接收到的廣播消息。 ![1726729470388](https://hackmd.io/_uploads/HJt9pStp0.gif) ### 透過Pusher Debug console測試 可以透過`Pusher`提供的`Debug console`來查看Log,也可以直接傳送事件,已進行測試 ![1726730925939](https://hackmd.io/_uploads/BJi-XUYT0.jpg) ## 常見問題與解決方案 1. `/broadcasting/auth 404 (Not Found)` 問題:使用私有頻道時,出現 /broadcasting/auth 404 (Not Found) 錯誤。 解決方案:確保在 bootstrap/app.php 中有包含 channels.php: ```php= return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__ . '/../routes/web.php', api: __DIR__ . '/../routes/api.php', commands: __DIR__ . '/../routes/console.php', channels: __DIR__ . '/../routes/channels.php', // 確保添加了此行 health: '/up', ) ``` 此外,在 `routes/channels.php` 中定義您的私有頻道授權規則。 2. `Did you forget to specify the cluster?` 問題:收到錯誤信息,提示是否忘記指定集群。 解決方案:檢查客戶端和服務器端的集群設置是否一致。 * 在 `echo.js` 中: ```javascript= window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_PUSHER_APP_KEY, cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER, forceTLS: true, }); ``` * 在 `.env` 中: ```makefile= PUSHER_APP_CLUSTER=ap3 ``` 確保 VITE_PUSHER_APP_CLUSTER 和 PUSHER_APP_CLUSTER 的值一致。如果更改了 .env,請清理配置快取並重新編譯資源: ```bash= php artisan config:cache npm run build ``` 3. 無法接收到廣播事件 問題:事件已觸發,但客戶端沒有收到。 解決方案: * 確認事件類實現了 ShouldBroadcast 接口。 * 檢查事件的 broadcastOn 方法,確保頻道名稱一致。 * 在客戶端,確認訂閱的頻道名稱和事件名稱正確。 * 檢查 Pusher 儀表板,查看事件是否成功發送。 ## 結論 通過以上步驟,我們成功地在` Laravel 11` 中使用 `Pusher Channels` 實現了廣播功能。這使得我們的應用可以實時地向客戶端推送消息,提升用戶體驗。 在實際項目中,您可以進一步探索私有頻道、存在頻道以及與身份驗證系統的集成。此外,`Laravel Broadcasting` 還支持其他廣播驅動,如 `Redis、Socket.IO` 等,您可以根據需要選擇最適合的方案。 希望本教程對您有所幫助!