定義頻道授權規則 - 如果是用PrivateChannel,需要定義頻道授權規則,如果是公共頻道(Channel)就不用。
- 在routes/channels.php這邊可以定義頻道授權規則,比如「驗證任何在 order.{orderId} 的私人頻道上嘗試監聽的使用者是否為實際該訂單的建立人」:
Broadcast::channel('order.{orderId}', function ($user, $orderId) {
return $user->id === Order::findOrNew($orderId)->user_id;
});
- 注意,如果是用JWT來做認證,需修改BroadcastServiceProvider:
原本是 Broadcast::routes(); 改成:
Broadcast::routes(['middleware' => ['auth:api']]);
自訂廣播名稱:
Laravel 預設會使用Event類別名稱去廣播事件,要自訂廣播名稱需定義broadcastAs() method:
public function broadcastAs()
{
return 'OrderUpdated';
}
Laravel Echo
$ npm install --save socket.io-client
$ npm install --save laravel-echo
resources/js/bootstrap.js最下方有寫好範例程式,去掉註解,改成用socket.io:
import Echo from 'laravel-echo';
window.io = require('socket.io-client');
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});
build code:
$ npm run dev
- 會將resources/js build到 public/js(resources/js/app.js = public/js/app.js)
- 由於app.js中有引用bootstrap.js,所以在頁面中引用app.js就能使用Echo了。
在 resources/views/ 下建立頁面 echo_ex.blade.php:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Laravel</title>
</head>
<body>
<script src="js/app.js"></script>
<script>
window.Echo.channel('order')
.listen('.OrderUpdated', (e) => {
console.log(e.order);
});
</script>
</body>
</html>
- 其中script src="js/app.js"/script這行就是引用public/js/app.js。
- 這邊值得提的是,listen OrderUpdated前面要多一個「.」,OrderUpdated是對應到broadcastAs()自訂的廣播名稱。
- Laravel Echo 會需要存取當前 session 的 CSRF token,header中要設定CSRF token。
- L13~L16就是laravel echo在監聽laravel echo server透過socket.io傳過來的訊息。
Laravel Echo Server
$ npm install -g laravel-echo-server
- project根目錄下,初始化laravel-echo-server,所有問題都用預設的:
$ laravel-echo-server init
會在根目錄產生一個laravel-echo-server.json,把devMode改成true方便debug:
$ laravel-echo-server start