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

rrr*_*lsz 7 php jobs notifications laravel

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

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

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

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

这是我的工作标题的样子:

class MyJob extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels, Queueable;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

    return response()->json(true);
}
Run Code Online (Sandbox Code Playgroud)

由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)
});
Run Code Online (Sandbox Code Playgroud)

小智 7

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

导入这个依赖项

use Illuminate\Support\Facades\Queue;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;
Run Code Online (Sandbox Code Playgroud)

在启动方法上你会使用它

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()
        });
    }
Run Code Online (Sandbox Code Playgroud)


lin*_*ine 5

可能我参加派对迟到了,但我能想到几个选择。当用户从前端单击按钮时,您可以为其设置禁用属性和一些文本,如“处理”。然后你可以:

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

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

  • 与其他答案不同,您的答案实际上是在回答问题,即如何在前端通知用户。如果您稍微扩展一下(例如,提供一些代码来显示如何 ping 服务器以获取该信息),并解释如何知道何时在后端完成工作(其他答案对此进行了解释),这将是一个很好的答案,我会接受的。 (2认同)

Ami*_*oud 5

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


Job*_*ose 1

工作完成事件

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

这已经在您从Laravel共享的页面链接中了。

  • 这没有解释如何向用户发送消息,即首先发送作业的同一线程。所有给出的例子都是关于在后台再次发生的事情。 (3认同)