使用 laravel5.2 、 vue.js 和 pusher 实时获取数据

Posted

技术标签:

【中文标题】使用 laravel5.2 、 vue.js 和 pusher 实时获取数据【英文标题】:Real Time Fetching data with laravel5.2 , vue.js and pusher 【发布时间】:2016-07-20 08:06:38 【问题描述】:

我有问题。 我正在使用推送器进行实时通知,当它运行时它会使用 noty 通知我, 但我也希望它在我的视图中实时显示新通知的数量,类似于 facebook。

<span class="label label-warning" v-show="new_count">@ new_count <!-- get the new notifications --></span>

我该怎么做?

这是我的代码。

nav.js

new Vue(
    el: '#nav',
    data: 
        new_count: 0
    ,

    methods: 
        getNewCount: function () 
            this.$http.get('cron', function(new_count)
                console.log(new_count);
                this.new_count = new_count;
            .bind(this));
        
    
);

Cron 作业控制器。此方法每分钟运行一次。

class CronJobController extends Controller


    public function getIndex()
    
        $old_fail_notification = FailNotification::where('seen', 0)->count();
        $subjects_with_fail = Grade::where('grade', 'F')->groupBy('subject_id')->orderBy('subject_id', 'ASC')->get();
        return response()->json(['new_count' => 2]); //send this to navbar
        foreach ($subjects_with_fail as $subject) 
            $subject_to_check = Grade::where('grade', 'F')->where('subject_id', $subject->subject_id)->where('reviewed', '0')->get(); //add if grade is IC or D

            if (count($subject_to_check) >= 3) 
                $failed = new FailNotification();
                $failed->message = '[subject-'.$subject->subject_id.'] can now be opened.';
                $failed->save();

                foreach ($subject_to_check as $subject) 
                    $subject = Grade::find($subject->id);
                    $subject->reviewed = 1;
                    $subject->save();
                
            
        
        $fail_notification = FailNotification::all()->count();
        //UPDATE NOTIFICATION COUNT HERE REAL TIME USING AJAX
        if ($fail_notification > $old_fail_notification) 
            $new_notification_count = $fail_notification - $old_fail_notification;

            Pusher::trigger('test-channel', 'test-event', [
                'name' => 'You have a new',
                'message' => 'Notification'
                ]);

            Pusher::trigger('navbar-channel', 'navbar-event', [
                'new_notif_count' => $new_notification_count,
                ]);

            return response()->json(['new_count' => $new_notification_count]); //send this to navbar
        


    

请告诉我我做错了什么以及如何做对。

【问题讨论】:

你在哪里订阅推送服务?如下所述,vue.resource 中的 get 方法是单一方法,需要不断监听 pusher 事件。在文档中,他们说您使用 susbcirbe 方法来做到这一点?你的 Vue 代码在哪里? 谢谢!我现在正在研究订阅推送服务。 【参考方案1】:

this.$http.get() 向服务器发出单个 GET 请求,但不会保持与服务器的连接打开。如果你想为你的网站添加实时功能,你应该实现类似 socket.io 的东西,它实现了 WebSockets。您还可以在后端执行longpolling 或在客户端执行shortpolling 以获得近乎实时的功能。

【讨论】:

socket.io 与推送器不同吗?我应该同时使用它们还是只使用socket.io? 你不再需要 socket.io,因为你想使用 Pusher。但从技术上讲,您可以同时使用这两种技术,它们都是 Web 套接字技术。 Socket.io 是一个开源库,可以自己实现 Web 套接字,而 Pusher 是一家通过他们的服务器为您提供该服务的公司。【参考方案2】:

如果你的 php 代码是正确的,那么你应该在 Vue 代码中添加订阅者。

首先包含 pusher 脚本(似乎不能作为 npm 包使用)

<script src="//js.pusher.com/3.0/pusher.min.js"></script>

然后,在 vue 中,使用您的 API_KEY 实例化您的推送器实例,然后订阅并收听

ready () 
  const pusher = new Pusher('APP_KEY')

  // susbcribe to your channel
  const channel = pusher.subscribe('test-channel')

  // listen to the event defined on that channel
  channel.bind('test-event', data => 
    console.log(data.message)
  )

应该可以。现在关于你的 php 代码。我不确定triggerevent 是推送器的类方法,在文档中我看到触发器被用作实例方法,并且有意义,因为您需要传递您的 api 密钥和其他身份验证值,并且在您创建实例时完成。

require('Pusher.php');

$pusher = new Pusher("APP_KEY", "APP_SECRET", "APP_ID");
$pusher->trigger('test_channel', 'test-event', array('message' => 'hello world') );

所以,请检查您的服务器代码是否正确,但您肯定在客户端做错了,尝试这些更改并检查您是否需要

【讨论】:

以上是关于使用 laravel5.2 、 vue.js 和 pusher 实时获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue JS 中的表格内显示图像以及基本 url (Laravel 5.2)

在 Laravel Homestead 中使用 Vue.js 时从 URL 中删除 # 哈希

Node.js 和 Vue.js,为啥 Refresh 让 vue.js 的 store 清晰?我如何在 vue.js 中使用上传的图片?

使用 Vue.js 和 express.js 交付 Html 文件

使用 Masonry.JS 和 Vue.JS

如何使用vue.js实现界面中英文切换