2015-10-02 5 views
5

私は、 'database'ドライバを使って 'SendMyEmail'と呼ばれる作業中のLaravel 5のジョブクラスを持っています。データベース 'jobs'テーブルは、このようなディスパッチされたジョブで正しく埋められます。Laravelの待機ジョブレコードにカスタムフィールドを追加しますか?

私はこれらのジョブをウェブサイト上に表示したいので、これらのジョブレコードが構築されるときに、これらのジョブレコードに「名前」というカスタムフィールドを追加して保存したいと考えています。 (私はこの名前をSendMyEmailクラスのコンストラクタのパラメータとして渡します)。

これを行う方法を知っている人はいますか?

答えて

2

いいえ、キューに入れられた/処理されたジョブの履歴を保持したいと思っています。

データベースフィールドをカスタマイズするための組み込みサポートはありません。

参照:

https://github.com/laravel/framework/blob/7212b1e9620c36bf806e444f6931cf5f379c68ff/src/Illuminate/Queue/DatabaseQueue.php#L170

http://i.imgur.com/nFciWi9.png

この動作が意図されて私の理解から、あなたは元のジョブ 'テーブルには本当に台無しではないはずだから。ステートレスに動作するように設計されています。つまり、ジョブレコードは処理された直後に削除されます。

あなたの仕事(履歴など)を把握したい場合は、新しいEloquentモデルを作成してジョブコンストラクタに渡すだけです。元のジョブと履歴を同期させておくために、これは便利です。


いいえ、コーディングを開始しますか?

PHPの職人メイクを:

を入力して新しい移行を作成し、移行create_jobs_history_table

は今、その移行を開き、次の列タイプを追加します。

データベース/移行/xyz_create_jobs_history_table

<?php 

use Illuminate\Support\Facades\Schema; 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateJobsHistoryTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('jobs_history', function(Blueprint $table) { 

      $table->bigIncrements('id'); 
      $table->unsignedInteger('user_id'); 
      $table->string('job', 40); 
      $table->integer('status')->default(0); 
      $table->timestamps(); 

      if (Schema::hasColumn('users', 'id')) 
      { 
       $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
      } 

     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::disableForeignKeyConstraints(); 
     Schema::dropIfExists('jobs_history'); 
     Schema::enableForeignKeyConstraints(); 
    } 
} 

説明:

あなたが見ることができるように、我々は のuser_id仕事と呼ばれる3つの新しいタイプを追加しましたおよびステータス

user_idは、ユーザーの実際のIDを参照します。

ジョブフィールドは、ジョブの説明/名前です。

ステータスフィールドはステータスを表します。 0 =まだ


を完了= 1、proccessedない今、私たちの移行の準備ができたことを、私たちはそれのための新しいモデルを定義してみましょう:JobHistory.php

アプリ/

<?php namespace App; use Illuminate\Database\Eloquent\Model; class JobHistory extends Model { protected $table = 'jobs_history'; protected $hidden = []; } 

甘い。今私たちのアプリケーションで私たちの仕事の歴史と簡単に交流することができます。


ジョブを作成するときです。以下のコードを使用して、そうしてみましょう:

アプリ/ジョブ/ProvisionUser.php

<?php 

namespace App\Jobs; 

use Illuminate\Bus\Queueable; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Foundation\Bus\Dispatchable; 

use App\User; 
use App\JobHistory; 

class ProvisonUser implements ShouldQueue 
{ 
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 

    protected $user; 
    protected $history; 

    /** 
    * Create a new job instance. 
    * 
    * @return void 
    */ 
    public function __construct(User $user, JobHistory $history) 
    { 
     $this->user = $user; 
     $this->history = $history; 

     // Set up our new history record. 

     $this->history->user_id = $this->user->id; 
     $this->history->job = 'Provison User'; 
     $this->history->status = 0; 

     $this->history->save(); 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle() 
    { 
     // Do other stuff here.... 

     // Once the job has finished, set history status to 1. 
     $this->history->status = 1; 
     $this->history->save(); 
    } 
} 

説明:

ここでは、ユーザーとJobHistoryモデルが含まれています。 コンストラクタでは、両方のモデルが必要で、新しい 履歴レコードを設定します。

実際のジョブは、新しい履歴レコードと同期されました。

良い。

ジョブが処理されている間に、handle()関数が呼び出されます。 ここでは、終了後にステータスを1に設定します。

そして最後には、単にあなたのコントローラ内のジョブをディスパッチ:

<?php 

namespace App\Http\Controllers; 

use Carbon\Carbon; 

use App\User; 
use App\JobHistory; 
use App\Jobs\ProvisionUser; 

class SomeController extends Controller 
{ 
    public function provision() 
    { 
     $user = User::find(1); 

     $job = (new ProvisionUser($user, new JobHistory)) 
      ->delay(Carbon::now()->addMinutes(1)); 

     dispatch($job); 

     return view('provision'); 
    } 
} 

は説明:

我々はコンストラクタに既存のユーザーと新規ジョブ履歴を渡します。 の後、私たちは遅延した仕事を派遣します。

注:遅延はデモ用です。

データベースを開き、jobs_historyテーブルを確認します。作業が発送されると、対応する履歴レコードのステータスは0になります。職人待ち行列作業員がジョブを処理したら、履歴レコードステータスは1になります。

この設定は、Laravel 5.4とI私のアプリケーションで同じロジックを使用してください。

ハッピーコーディング!

+0

ステータス2で失敗したジョブを入れたいのですが、どうすれば対処できますか? – cartbeforehorse

+0

私自身の質問に答えて、 'try {}'ブロックの 'handle()'関数にコード全体をラップし、例外をキャッチし、履歴のステータスを2に設定すると思います。あなたはそれをどうやってやるの? – cartbeforehorse

+0

@cartbeforehorseそれは私がそれをする方法です。 – Steven

関連する問題