2017-01-23 46 views
1

我喜歡在服務類app(MailService::class);中編寫繁重的邏輯,但是來自服務類 - 您將如何響應回作業類來執行$this->release()或嘗試檢查如$this->attempts()Laravel - 如何讓Service Class變得靈活?

類似的,你將如何迴應命令(SendReminderCommand)進入$this->error()$this->info() - 這對控制器也應該是靈活的。

我想使用服務類是靈活的,因此它可以與作業類,命令甚至控制器一起使用。

例如:

作業類

class SendReminderEmail extends Job implements SelfHandling, ShouldQueue 
    { 
     use InteractsWithQueue, SerializesModels; 

     public function handle() 
     { 
      $mail = app(MailService::class); //service class 

      $this->release(10) 
      $this->attempts() 
     } 
    } 

命令類

class SendReminderCommand extends Command 
{ 
    protected $signature = 'email:reminder'; 
    protected $description = 'Send Reminder'; 

    public function handle() 
    { 
     $mail = app(MailService::class); //service class 

     $this->info("Emails Sent"); 
     $this->error('Something went wrong!'); 
    } 
} 
+0

你的'MailService'是否在其構造函數中執行初始化之外的其他操作? – nCrazed

+0

@nCrazed MailService只是一個示例類名...可以是任何類class MailService {}'隨意發佈一個答案。 –

+0

我更關心的是,在實例化它之後,您並未試圖在'MailService'實例上調用任何方法。 – nCrazed

回答

1

你可以組織你的服務方式,使非查詢方法可以被假定爲有如果沒有像這樣拋出異常,那麼就成功了:

public function handle(MailService $mail) 
{ 
    try { 
     $mail->performAction(); 
     $this->info('Action Complete'); 
    } catch (RecoverableProblem $e) { 
     /* Recover and perhaps retry at a later time? */ 
    } catch (UnrecoverableProblem $e) { 
     $this->error('Something went wrong!'); 
     /* Abort? */ 
    } 
} 

如果您需要將一些附加信息傳遞給日誌記錄方法,只需從服務方法返回該信息並使用返回值構建郵件即可。

+0

感謝您的回答。 '使用返回值構建消息'我不確定你的意思。你的意思是返回這樣的東西'return ['success'=> true,'message'=>'information message here'];'如果不是,你可以更新你的答案你的意思是什麼。 –

+0

這取決於什麼被視爲失敗。在大多數情況下,最好在失敗時拋出一個異常,並讓調用者(在這種情況下是你的命令或隊列作業類)按照它認爲合適的方式處理它。這樣就不需要明確的成功確認。沒有例外就意味着成功,只有實際的數據需要由方法返回。 – nCrazed

+0

這就是我的意思,實際數據應該如何返回該方法? –