Laravel 8 類結(jié)構(gòu)

2021-07-19 11:00 更新

任務(wù)類非常簡單,通常只包含一個 handle 方法,在隊列處理任務(wù)時將會調(diào)用它。讓我們從一個任務(wù)類的例子看起。在這個例子中,我們假設(shè)我們管理一個 podcast 服務(wù),并且需要在上傳的 podcast 文件發(fā)布之前對其進行處理:

<?php

namespace App\Jobs;

use App\Models\Podcast;
use App\Services\AudioProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

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

    protected $podcast;

    /**
     * 創(chuàng)建一個新的任務(wù)實例。
     *
     * @param  Podcast  $podcast
     * @return void
     */
    public function __construct(Podcast $podcast)
    {
        $this->podcast = $podcast;
    }

    /**
     * 運行任務(wù)
     *
     * @param  AudioProcessor  $processor
     * @return void
     */
    public function handle(AudioProcessor $processor)
    {
        // Process uploaded podcast...
    }
} 

在本例中,請注意我們能夠?qū)⒁粋€ Eloquent model 直接傳遞到已排隊任務(wù)的構(gòu)造函數(shù)中。由于任務(wù)所使用的 SerializesModels ,在任務(wù)處理時,Eloquent 模型及其加載的關(guān)系將被優(yōu)雅地序列化和非序列化。如果你的隊列任務(wù)在其構(gòu)造函數(shù)中接受一個 Eloquent 模型,那么只有模型的標(biāo)識符才會被序列化到隊列中。當(dāng)實際處理任務(wù)時,隊列系統(tǒng)將自動重新從數(shù)據(jù)庫中獲取完整的模型實例及其加載的關(guān)系。它對你的應(yīng)用程序來說是完全透明的,并且可以防止在序列化完整的 Eloquent 模型實例時可能出現(xiàn)的問題。

當(dāng)任務(wù)由隊列處理時,將調(diào)用 handle 方法。注意,我們可以對任務(wù)的 handle 方法進行類型提示依賴。Laravel 服務(wù)容器 會自動注入這些依賴項。

如果您想完全控制容器如何將依賴注入 handle 方法,你可以使用容器的 bindMethod 方法。bindMethod 方法接受一個回調(diào),該回調(diào)接收任務(wù)和容器。在回調(diào)中,你可以隨意調(diào)用 handle 方法。通常,您應(yīng)該從服務(wù)提供者中調(diào)用此方法:

use App\Jobs\ProcessPodcast;

$this->app->bindMethod(ProcessPodcast::class.'@handle', function ($job, $app) {
    return $job->handle($app->make(AudioProcessor::class));
}); 

注意:二進制數(shù)據(jù),例如原始圖像內(nèi)容,應(yīng)該在傳遞到隊列任務(wù)之前通過 base64_encode 函數(shù)傳遞。否則,在將任務(wù)放入隊列時,可能無法正確地序列化為 JSON。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號