web-dev-qa-db-ja.com

Laravelでジョブが完了したことをユーザーに通知するにはどうすればよいですか?

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)
});
8
rrrafalsz

おそらく私はパーティーの人たちに遅れていますが、私が考えることができるいくつかのオプションがあります。ユーザーがフロントエンドからボタンをクリックすると、属性を無効にし、「処理中」などのテキストを指定できます。次に、次のことができます。

  1. エンドポイントにpingを実行して、実行中のジョブが終了したかどうかを確認するだけです
  2. WebSocketを使用する

Forgeは、エンドポイントのプッシャーを使用してWebSocketを実行し、新しいコードをデプロイしようとしているときにサーバーがアクティブかどうかを確認していると思います。 Devtools-> Resources-> Socketsを開くと、通信がはっきりとわかります。

4
linkmarine

キューイベントを使用できます、Laravelドキュメントはそれを説明しています: https://laravel.com/docs/5.6/queues#job-events

4
Amirmasoud

仕事完了イベント

Queue::afterメソッドを使用すると、キューに入れられたジョブが正常に実行されたときに実行されるコールバックを登録できます。このコールバックは、追加のロギングを実行したり、後続のジョブをキューに入れたり、ダッシュボードの統計をインクリメントしたりする絶好の機会です。

これは、あなたが共有したページリンクにすでにあります Laravel

2
Jobin Jose

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()
        });
    }
2
Leandro Castro