Laravel队列通知错误:' Closure'的序列化不被允许

时间:2017-04-26 20:07:30

标签: laravel laravel-5 laravel-queue laravel-notification

我已经创建了一个成功运行的邮件通知,但在尝试排队时,我收到以下错误:

SimpleNumberList

以下是我认为导致错误的代码:

Uncaught Exception: Serialization of 'Closure' is not allowed in /vendor/laravel/framework/src/Illuminate/Queue/Queue.php:125

我不确定'关闭'它试图序列化来自于。我尝试在public function toMail($notifiable) { $view_file = 'emails.verifyEmail'; $view = View::make($view_file, ['invitationToken' => $this->invitationToken, 'team_name' => $this->team->name, 'team_domain' => $this->team->domain ]); $view = new HtmlString(with(new CssToInlineStyles)->convert($view)); return (new MailMessage) ->subject('Email Verification') ->view('emails.htmlBlank', ['bodyContent' => $view]); } 结束->render(),但这似乎没有什么区别。我认为这可能与View::make的{​​{1}}功能有关,但我并不确定。

再一次,这个通知在没有排队时非常有效。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

即使问题很老,我也会将其发布以供将来参考。

当Queue尝试序列化通知实例时,会出现此问题。这是通过序列化通知对象的每个属性来完成的。我遇到了同样的问题,因为我正在做类似

的事情
public function __construct(\Exception $ex){
   $this->exception = $exception;
}

在我的通知课程中。 通知包含在 SendQueuedNotification 后,将由队列处理程序序列化。在此过程中, SendQueuedNotification 的每个属性都将被序列化,包括我们的自定义通知实例及其属性。当序列化程序尝试序列化$exception实例时,一切都会失败;由于某种原因,异常类是不可序列化的,因为它可能在其属性中包含一个闭包。那么对我有用的是改变构造函数如下

public function __construct(\Exception $ex)
{
    $this->exceptionClass = get_class($ex);
    $this->exceptionMessage = $ex->getMessage();
    $this->exceptionLine = $ex->getFile() . '@' . $ex->getLine();
    $this->exceptionCode = $ex->getCode();
}

现在所有通知属性都是完全可序列化的,一切都按预期工作。

另一种解决方案是使用__wakeup()__sleep()方法来自定义通知实例的序列化和反序列化。

希望有助于理解您的问题。