美文网首页
Laravel + pusher 遇到的小问题

Laravel + pusher 遇到的小问题

作者: Julian1009 | 来源:发表于2017-11-10 14:44 被阅读0次

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

    相关文章

      网友评论

          本文标题:Laravel + pusher 遇到的小问题

          本文链接:https://www.haomeiwen.com/subject/jmubmxtx.html