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


How to notify the user that a job has completed in Laravel?

在Laravel中,您可以使用作业在后端队列中执行任务,而应用程序的其余部分则执行其他操作。 我有一个由用户输入启动的工作。 我立即通过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)
});

你可以在应用服务提供程序上使用 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()
        });
    }

可能我迟到了派对的人,但我能想到几种选择。当用户从前端单击按钮时,您可以禁用属性和一些文本,例如"处理"。然后,您可以:

  1. 只需 ping 端点即可检查正在执行的作业是否已完成
  2. 使用网络套接字

我认为 Forge 正在使用 pusher 端点进行 websocket,以查看当您尝试部署新代码时服务器是否处于活动状态。如果您打开Devtools->Resources->Sockets,我可以清楚地看到通信。

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

作业完成事件

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

这已经在您从拉拉维尔共享的页面链接中。