W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
任務(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。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: