Laravel + pusher 遇到的小问题

2017-11-10  本文已影响0人  Julian1009

根据文档说明,只需在项目中安装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都没有阻止消息的发送。

上一篇下一篇

猜你喜欢

热点阅读