序列化'关闭'使用队列时不允许使用

时间:2017-09-26 10:07:05

标签: php laravel laravel-5.5

这是我的RequestMail.php文件:

protected $phone;

/**
 * Create a new message instance.
 *
 * @return void
 */
public function __construct(Request $request)
{
    $this->request = $request;
    $this->phone = $request->get('phone');
}

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->from('robot@bithub.tech')
                ->view('request')
                ->subject('Новая заявка на обмен криптовалют')
                ->with(['phone' => $this->phone]);
}

我的控制器:

Mail::to('request@domain.com')->queue(new RequestMail($request));

当我尝试排队邮件时,我收到以下错误:"'关闭'序列化不允许"

编辑更新了最终代码。

1 个答案:

答案 0 :(得分:1)

如果使用队列,则无法序列化包含闭包的对象,这就是PHP的工作方式。每次将作业推送到队列时,Laravel将其属性序列化为可写入数据库的字符串,但匿名函数(例如,不属于任何类的函数)不能表示为字符串值,因此它们不能被序列化。因此,基本上当您将RequestMail作业推送到队列时,Laravel会尝试序列化其属性,但$request是包含闭包的对象,因此无法序列化。要解决此问题,您必须存储在RequestMail类仅可序列化的属性中:

protected $phone;

/**
 * Create a new message instance.
 *
 * @return void
 */
public function __construct(Request $request)
{
    $this->phone = $request->get('phone');
}

public function build()
{
    return $this->from('robot@domain.com')
                ->view('request')
                ->subject('New request for exchange')
                ->with(['phone' => $this->phone]);
}

执行此类操作时,您只保留实际需要的$request属性,在本例中为电话号码,即字符串,并且完全可序列化。

修改 我刚才意识到这是一个duplicate

编辑2 我已使用正确的请求参数检索编辑了代码,以供进一步参考。