在使用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方法中調用