根据文档说明,只需在项目中安装pusher-js
,
$ npm install --save laravel-echo pusher-js
在resources/assets/js/bootstrap.js
文件中,去掉如下代码的注释,并且添加上几行代码,把提前在pusher注册好的账号信息填上即可。
最终应该如下所示
import Echo from "laravel-echo"
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key',
cluster: 'eu',
encrypted: true
});
但尝试写了个小Demo后,发现一直报如下错误,
Uncaught ReferenceError: Pusher is not defined
最后在官方GitHub的Issue中找到了解决办法,只需要在上方的代码中加一行就可以了,结果如下,
import Echo from "laravel-echo"
window.Pusher = require('pusher-js')
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key',
cluster: 'eu',
encrypted: true
});
这样就可以了。
下来尝试换成私有频道。
根据文档命令行生成event后,需要实例一个私有频道
/**
* Get the channels the event should broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return new PrivateChannel('order.'.$this->update->order_id);
}
然后再在/routes/channel.php
中验证是否符合业务需求
Broadcast::channel('order.{orderId}', function ($user, $orderId) {
return $user->id === Order::findOrNew($orderId)->user_id;
});
前端用laravel-echo
监听
Echo.private(`order.${orderId}`)
.listen('ShippingStatusUpdated', (e) => {
console.log(e.update);
});
文档到此结束,但是这并没有成功,
浏览器console中会报错
Pusher : Couldn't retrieve authentication info. 403Clients must be authenticated to join private or presence channels. See: https://pusher.com/docs/authenticating_users
查看pusher的文档,原来pusher也是需要验证的,最终代码如下
首先修改resources/assets/js/bootstrap.js
部分,添加一行代码
import Echo from "laravel-echo"
window.Pusher = require('pusher-js')
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key',
cluster: 'eu',
encrypted: true,
authEndpoint: "/broadcasting/auth"
});
后端需要添加这一条路由"/broadcasting/auth"(POST请求)
去获取
{
"auth": $AUTHORIZATION_STRING // 这是一个加密过的字符串
}
我的获取代码如下:
Route::post('/broadcasting/auth', function () {
$options = array(
'cluster' => 'ap1',
'encrypted' => true
);
$pusher = new Pusher\Pusher(
'77e1f8df97fe472784b1',
'9aaff01882ef1ce7fb73',
'424520',
$options
);
if (auth()->check()){
echo $pusher->socket_auth($_POST['channel_name'], $_POST['socket_id']);
}else{
header('', true, 403);
echo "Forbidden";
}
});
这样私有频道就通了。
但是有一个问题尚未解决,那就是在/routes/channels.php
中,对私有频道定义授权回调不能成功。
Broadcast::channel('channel-name.{orderId}', function($user, $orderId){
dd($orderId);
return false;
});
这个dd()
和return false
都没有阻止消息的发送。
网友评论