如何在Laravel中通知用户作业已完成?

时间:2016-02-11 10:40:06

标签: php laravel notifications jobs

在Laravel中,您可以使用jobs在后端队列中执行任务,而其他应用程序则执行其他操作。我有一个由用户输入启动的工作。立即通过javascript向用户发出正在处理作业的通知。

我希望能够在工作顺利完成后发出类似的通知。

我在这样的模型中调用我的工作:

public function doSomething() {
    $job = new \App\Jobs\MyJob();
    app('Illuminate\Contracts\Bus\Dispatcher')->dispatch($job);
}

这就是我的职位标题:

class MyJob extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels, Queueable;
    ...
}

模型作业调用实际上是从控制器方法触发的:

public function getDoSomething($id) {
    $item = Item::findOrFail($id);
    $item->doSomething();

    return response()->json(true);
}

由AJAX调用处理:

$.ajax({
    url: $(this).attr('href'),
    type: 'GET',
    dataType: 'json',
    success: $.proxy(function(result) {
        this.application.notification.showMessage('Job is being processed.');
    }, this),
    error: $.proxy(function(result) {
        console.error(result);
    }, this)
});

4 个答案:

答案 0 :(得分:3)

您可以使用队列事件,Laravel文档解释它:https://laravel.com/docs/5.6/queues#job-events

答案 1 :(得分:1)

工作完成事件

Queue::after方法允许您注册在排队作业成功执行时要执行的回调。此回调是执行其他日志记录,为后续作业排队或增加仪表板统计信息的绝佳机会。

这已在您从Laravel分享的页面链接中。

答案 2 :(得分:1)

对于派对来说,我可能已经迟到了,但我可以想到几种选择。当用户点击前端的按钮时,您可以将属性设置为禁用,并为某些文本添加“处理”等文本。然后你可以:

  1. 只需ping您的端点以检查哪个作业正在执行
  2. 使用websockets
  3. 我认为Forge正在使用推送器端口来执行websockets,以便在您尝试部署新代码时查看服务器是否处于活动状态。如果您打开Devtools-> Resources->套接字,我可以清楚地看到通信。

答案 3 :(得分:1)

您可以在AppServiceProvider上使用Queue :: after函数

导入此依赖项

use Illuminate\Support\Facades\Queue;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;

在启动方法上,您将使用它

public function boot()
    {
        Queue::before(function (JobProcessing $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });

        Queue::after(function (JobProcessed $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });
    }