2015-10-02 6 views
5

Ich habe eine funktionierende Laravel 5 Job-Klasse namens 'SendMyEmail' mit dem 'Datenbank' Treiber. Die Jobtabelle der Datenbank ist mit solchen versandten Jobs korrekt gefüllt.Ein benutzerdefiniertes Feld zu den Jobaufzeichnungen in der Laravel-Warteschlange hinzufügen?

Ich möchte diese Jobs auf einer Website anzeigen und daher möchte ich hinzufügen und speichern Sie einen Wert auf ein benutzerdefiniertes Feld namens "Name" auf diese Jobs Datensätze, wenn sie erstellt werden. (Ich würde diesen Namen als Parameter an den SendMyEmail-Klassenkonstruktor übergeben.)

Weiß jemand, wie man das macht?

Antwort

2

In Ordnung, also möchten Sie eine Geschichte der in der Warteschlange befindlichen/verarbeiteten Jobs behalten, richtig.

Es gibt keine integrierte Unterstützung für die Anpassung der Datenbankfelder.

Siehe:

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

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

Von meinem Verständnis dieses Verhalten bestimmt ist, weil Sie mit dem Original 'Jobs' Tabelle nicht wirklich Chaos sollen. Es wurde entwickelt, um staatenlos zu arbeiten. Das bedeutet, dass ein Jobdatensatz sofort nach der Verarbeitung entfernt wird.

Wenn Sie Ihre Jobs verfolgen möchten (zB Verlauf), können Sie einfach ein neues Eloquent-Modell erstellen und es an Ihren Job-Konstruktor übergeben. Dies ist nützlich, um den ursprünglichen Job und Ihren Verlauf synchron zu halten.


Okay, fangen wir an zu codieren, sollen wir?

erstellen neue Migrations durch Eingabe:

php Handwerker machen:

nun, dass die Migration öffnen und die folgenden Spaltentypen create_jobs_history_table Migration hinzufügen.

Datenbank/Migration/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(); 
    } 
} 

Erläuterung:

Wie Sie sehen können, wir nannten drei neue Typen User_id, Job hinzugefügt und Status.

Die user_id verweist auf die tatsächliche ID eines Benutzers.

Der Job Feld ist nur eine Beschreibung/Name des Jobs.

Das Feld Status repräsentiert den Status. 0 = Noch nicht proccessed, 1 = Fertig


Nun, da unsere Migration bereit ist, lassen Sie uns ein neues Modell für sie definieren:

app/JobHistory.php

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class JobHistory extends Model 
{ 
    protected $table = 'jobs_history'; 

    protected $hidden = []; 

} 

Süß. Jetzt können wir in unserer Anwendung einfach mit unserer Jobhistorie interagieren.


Es ist Zeit, einen Job zu erstellen. Lassen Sie uns dies tun, indem Sie den folgenden Code verwendet:

app/Jobs/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(); 
    } 
} 

Erläuterung:

Hier haben wir die User und JobHistory Modelle enthalten. In unserem Konstruktor benötigen wir beide Modelle und wir erstellen einen neuen Verlaufsdatensatz.

Der eigentliche Job ist nun mit unserem neuen Verlaufsdatensatz synchronisiert!

Gut.

Die handle()-Funktion wird aufgerufen, während der Job verarbeitet wird. Hier setzen wir den Status auf 1, sobald es fertig ist.

Und schließlich Versand einfach den Job in Ihrem Controller:

<?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'); 
    } 
} 

Erläuterung:

Wir passieren einen vorhandenen Benutzer und neue Job-Historie an den Konstruktor. Nach versenden wir den verspäteten Auftrag.

Hinweis: Die Verzögerung dient nur zu Demonstrationszwecken.

Öffnen Sie Ihre Datenbank und überprüfen Sie Ihre Tabelle jobs_history. Sobald der Auftrag versandt wurde, sollte der Status des entsprechenden Verlaufssatzes 0 sein. Sobald der Handwerkerwarteschlangenarbeiter den Auftrag bearbeitet hat, sollte der Status 1 sein.

Ich habe dieses Setup mit Laravel 5.4 und I getestet verwende dieselbe Logik in meiner Anwendung.

Glückliche Codierung!

+0

Ich möchte einen fehlgeschlagenen Job in Status 2. Wie würde ich damit umgehen? – cartbeforehorse

+0

Als Antwort auf meine eigene Frage würde ich wohl den gesamten Code in die 'handle()' Funktion in einem 'try {}' Block schreiben, Ausnahmen abfangen und den Verlaufsstatus auf 2 setzen. Ich würde es gerne wissen Wie würdest du es tun? – cartbeforehorse

+0

@cartbeforehorse Genau so würde ich es machen. – Steven

Verwandte Themen