zoukankan      html  css  js  c++  java
  • 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方法中调用

  • 相关阅读:
    Vue项目搭建及原理三
    Vue项目搭建及原理一
    JS Cookie丢失问题
    1027 Colors in Mars
    1028 List Sorting
    1029 Median
    1030 Travel Plan
    1031 Hello World for U
    1032 Sharing
    1033 To Fill or Not to Fill
  • 原文地址:https://www.cnblogs.com/mzli/p/12572780.html
Copyright © 2011-2022 走看看