laravel 使用隊列報錯Serialization of 'Closure' is not allowed


在使用laravel中的隊列的時候,有可能會出現以下這個報錯

 

 

 從給出的錯誤信息上分析,說不預序我們序列化閉包,其實這個問題的原因在於,我們在jobs中的任務類中的構造函數接受的參數有問題,我們需要分析一下幾個問題

1、什么情況下使用jobs任務類中的構造函數?

2、什么情況下使用jobs任務類中的handle方法?

3、任務類中的SerializesModels是什么作用

 

 

首先問題1什么情況下程序執行jobs任務類中的構造函數?這個很簡單當然是我們在new jobs/任務類的時候會執行構造函數,當然可以在new 任務類的時候傳遞參數

問題2什么情況下執行任務類中的handle?官方文檔這樣介紹的

 

這就很明顯了,也就是說當我們的隊列被消費的時候才會執行handle

問題3 SerializesModels有什么作用呢?

SerializesModels trait,Eloquent 模型將會在任務被執行時優雅地序列化和反序列化。如果你的隊列任務在構造函數中接收 Eloquent 模型,只有模型的主鍵會被序列化到隊列,當任務真正被執行的時候,隊列系統會自動從數據庫中獲取整個模型實例

簡單的理解就是SerializesModels把我們傳遞的參數序列化和反序列化,但是他序列化的值存到了jobs表中的attempts字段值所以文章開頭時的問題就找到了根源,我們在構造函數中接收的參數,或者定義的參數有沒有出現new xxx(),因為這種類的調用,SerializesModels是沒有辦法序列化的例如有沒有出現

 

 如果在構造函數中出現這種調用,那么把他注視掉,問題就可以解決了,如果需要使用這個類,可以在handle方法中調用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM