2017-04-26 120 views
0

我創建了一個郵件通知成功的作品,但試圖排隊它的時候,我得到以下錯誤:Laravel QUEUEABLE通知錯誤:序列化「封閉」是不允許的

Uncaught Exception: Serialization of 'Closure' is not allowed in /vendor/laravel/framework/src/Illuminate/Queue/Queue.php:125

以下是我的代碼,我相信是會導致錯誤:

public function toMail($notifiable) 
{ 
    $view_file = 'emails.verifyEmail'; 
    $view = View::make($view_file, ['invitationToken' => $this->invitationToken, 'team_name' => $this->team->name, 'team_domain' => $this->team->domain ]); 

    $view = new HtmlString(with(new CssToInlineStyles)->convert($view)); 

    return (new MailMessage) 
     ->subject('Email Verification') 
     ->view('emails.htmlBlank', ['bodyContent' => $view]); 
} 

我不是很確定,其中「關閉」這是試圖序列的來源。我試圖在->render()上加上View::make的結尾,但這似乎沒有什麼區別。我相信這可能與MailMessageview功能有關,但我不確定。

再次說明,此通知在未被排隊時完美工作。

任何幫助,將不勝感激。

+0

如果您真的認爲它在這些行中,請通過從提供錯誤的行進行跟蹤來確定哪一行,或者使用步驟調試,或者在每個行之後使用「退出」語句來確定哪一行確切地拋出錯誤。然後你可以回家問題。 –

+0

@PaulJeromeBordallo我知道哪一行導致錯誤。堆棧跟蹤沒有幫助,因爲它全部指向核心laravel代碼。我知道錯誤是什麼,我只是不知道如何解決它。 –

回答

1

即使問題很老,我發佈這個以備將來參考。

隊列嘗試序列化通知實例時發生此問題。這是通過序列化通知對象的每個屬性完成的。我有同樣的問題,因爲我正在做類似於

public function __construct(\Exception $ex){ 
    $this->exception = $exception; 
} 

在我的通知類。 一旦通知封裝在SendQueuedNotification它將被序列化隊列處理程序。在此過程中,SendQueuedNotification的每個屬性都將被序列化,包括我們的自定義通知實例及其屬性。當串行器嘗試序列化$exception實例時,一切都會失敗;出於某種原因,異常類是不可序列化的,因爲它可能在其屬性中包含閉包。那麼,什麼工作對我來說是改變構造如下

public function __construct(\Exception $ex) 
{ 
    $this->exceptionClass = get_class($ex); 
    $this->exceptionMessage = $ex->getMessage(); 
    $this->exceptionLine = $ex->getFile() . '@' . $ex->getLine(); 
    $this->exceptionCode = $ex->getCode(); 
} 

現在所有的通知性質的完全序列化,一切按預期工作。

另一種解決方案是使用__wakeup()__sleep()方法來自定義通知實例的序列化和反序列化。

希望它有助於理解您的問題。

相關問題