簡體   English   中英

將自定義字段添加到Laravel排隊的作業記錄中?

[英]Add custom field to Laravel queued job records?

我有一個工作Laravel 5排隊的工作類,使用'database'驅動程序稱為'SendMyEmail'。 數據庫'jobs'表正確地填充了這樣的調度作業。

我想在網站上顯示這些作業,因此我想在構造這些作業記錄時在名為“name”的自定義字段上添加和保存值。 (我會將此名稱作為參數傳遞給SendMyEmail類構造函數..)

有誰知道如何做到這一點?

好吧,所以你想保留排隊/處理過的工作的歷史,對吧。

沒有任何內置支持來自定義數據庫字段。

看到:

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

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

根據我的理解,這種行為是有意的,因為你不應該真正搞亂原來的“工作”表。 它被設計為無國籍的。 這意味着作業記錄在處理完畢后立即被刪除。

如果您想跟蹤您的工作(例如歷史記錄),您可能只需創建一個新的Eloquent模型並將其傳遞給您的工作構造函數。 這很有用,可以保持原始作業和歷史記錄的同步。


好吧,讓我們開始編碼,好嗎?

輸入以下內容創建新遷移

php artisan make:migration create_jobs_history_table

現在打開該遷移並添加以下列類型。

database / migrations / 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_idjobstatus的新類型。

user_id引用用戶的實際ID。

作業字段只是作業的描述/名稱。

狀態字段表示狀態。 0 =尚未執行,1 =完成


現在我們已經准備好了遷移,讓我們為它定義一個新模型:

app / JobHistory.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

    protected $hidden = [];

}

甜。 現在,我們可以輕松地在我們的應用程序中與我們的工作歷


是時候創造一份工作了。 讓我們使用以下代碼:

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

說明:

這里我們包括User和JobHistory模型。 在我們的構造函數中,我們需要兩個模型,並且我們設置了新的歷史記錄。

現在,實際工作與我們的新歷史記錄同步!

好。

handle()作業時調用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測試了這個設置,我在我的應用程序中使用了相同的邏輯。

快樂的編碼!

請嘗試此代碼以獲取失敗的工作。

 <?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;
        protected $id;

        /**
         * 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 and get unique id
            $this->id = DB::table('jobs_history')->insertGetId([
                'user_id' => $this->user->id,
                'job' => 'Provison User',
                'status' => 0

            ]);

        }

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

            try{
                $JobHistory = JobHistory::findOrfail($this->id);
                // Once the job has finished, set history status to 1.
                $JobHistory->status = 1;
                $JobHistory->save();
            }catch (\Exception $e){
                // failed job, set history status to 1.
                $JobHistory->status = 2;
                $JobHistory->save();
            }

        }
        public function failed()
        {
            $JobHistory = JobHistory::findOrfail($this->id);
            // failed job, set history status to 1.
            $JobHistory->status = 2;
            $JobHistory->save();
        }
    }

就我而言,這段代碼正在運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM