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