2017-09-19 37 views
1

我在使用laravel隊列時遇到問題。由於我正在使用擴展架構,所以我所做的大部分工作都是使用隊列和作業來實現的。例如,處理大文件時,會爲文件中的每1000行創建一個作業,並將結果保存到輸出文件中。Laravel如何在執行前後調用作業類的方法

我有一個「Process」類,我目前正在使用它作爲作業的父項。進程類具有start()和end()方法,一旦調用作業handle()方法並在方法執行後應該調用它。目前的解決方案是從句柄方法調用這些方法,但問題是這個解決方案會增加作業類本身中不必要的代碼,並由實施者記住調用這些方法。

public function handle() 
{ 
    $this->start(); // <- implementer has to remember to call this 

    // Do the actual handle functionality 

    $this->end(); // <- and this 
} 

所以我想知道是否有一個「乾淨」的方式做到這一點,不需要從工作(兒童)類的父方法調用? 我嘗試使用queue events,但不能從給定的事件對象構造作業類。來自工作的Dispatching an event並沒有真正的幫助,因爲您仍然必須在每個工作類中添加這兩行額外的行。

在laravel特定實現之外,我還研究了magic __call()方法,但只有在「handle」方法不存在的情況下才會起作用,考慮到技術人員使用:job命令默認生成該方法(再次要求實施者足夠精明以將其刪除)。

要明確這一點,目前的解決方案確實有效,但它似乎像一個代碼味道是複製每一個班級相同的線。

回答

1

您可以創建將有手柄功能的父類,他會叫的孩子一個受保護的功能,讓您的邏輯,例如:

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

    protected function start() { 
     // your start logic 
    } 

    protected function stop() { 
     // your stop logic 
    } 

    protected function process() { 
     // will be overrittten 
    } 

    public function handle() { 
     $this->start(); 
     $this->process(); 
     $this->stop(); 
    } 
} 

而且所有作業會延長你類,例如:

class SpecificJob extends MyJob 
{ 
    protected function process() { 
     // logic 
    } 
} 
+0

不錯,簡單。我在下意識地忽略了一些類似的東西,他們認爲用戶會想用artisan命令來生成每一項工作,最終會在每個孩子班級中處理方法。我敢肯定,如果沒有make:job,寫出或生成孩子的工作並沒有太多的努力。爲了「解決」你的解決方案,我個人建議讓父母成爲一個抽象類並使「處理」一個抽象函數,以確保它是由孩子聲明的。 – Nonetallt

0

查看文檔here的功能完成後調用。我相信如果你四處挖掘,你會發現把BEFORE方法放在哪裏。

+0

我嘗試過,但有一個問題:由事件回調返回的「作業」變量不是反序列化的作業,而是[照明作業超類]的實例(https://laravel.com/api/5.4/照明/隊列/工作/ Job.html)。由於「解析」方法受到保護,因此不能使用序列化的數據重建對象。這意味着無法在「過程」類上調用任何方法。 – Nonetallt

相關問題