首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel可排队通知错误:不允许序列化“闭包”

Laravel可排队通知错误:不允许序列化“闭包”
EN

Stack Overflow用户
提问于 2017-04-26 20:07:30
回答 1查看 3.7K关注 0票数 2

我已经创建了一个成功工作的邮件通知,但是当尝试对它进行队列时,我会得到以下错误:

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

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

代码语言:javascript
运行
复制
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的末尾,但这似乎没有什么区别。我相信这可能与MailMessageMailMessage函数有关,但我不太确定。

再一次,这个通知在没有排队的时候工作得很好。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2017-07-25 12:55:35

即使这个问题很老,我也会把这个贴出来供将来参考。

当队列试图序列化通知实例时,会出现此问题。这是通过序列化通知对象的每个属性来完成的。我也有同样的问题,因为我做的事情

代码语言:javascript
运行
复制
public function __construct(\Exception $ex){
   $this->exception = $exception;
}

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

代码语言:javascript
运行
复制
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()方法自定义通知实例的序列化和反序列化。

希望它有助于理解你的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43643626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档