1

我正在使用 Laravel Notification 来通知用户某些事情。一切都按预期工作,但在某些情况下我会收到下一个错误。

(1/1) InvalidPayloadException
Unable to JSON encode payload. Error code: 5

当我收到这些错误时,我注意到的是,被通知的用户在 users 表的 BLOB 列中有数据。我的猜测是,由于某种原因,Laravel 无法序列化 BLOB 列中包含的值,因此我得到了上面显示的错误。

实际上,如果我将该列的值更改为 NULL,则通知过程会完美运行。我尝试在 User 模型中使用 hidden 和 cast 属性,但它没有帮助。

阅读文档我还没有找到改变序列化的方法,所以我可以让它工作。我有什么可以改变这种行为的吗?

我很欣赏你的评论。提前致谢!

4

1 回答 1

0

正如您自己发现的JSON不接受二进制数据,这里的技巧是将BLOB编码为base64以便它可以在JSON中使用,唯一的缺点是您必须在检索JSON时对其进行解码。

模型JSON序列化时,您可以在模型上使用一个accessor能够自动编码Blob 字段,即:

// in User Model
public function getBlobAttribute($value)
{
    return base64_encode($value);
}

您只需要记住在将BLOB用作真正的二进制数据(例如,如果它是图像)时对其进行解码,即:

$blob = base64_decode($model->blob)

或者,您可以编写一个检索 blob 的方法,而无需使用accessor

// in User Model
public function getRawBlob()
{
    $this->getOriginal('blob');
}

我希望这有帮助。

于 2019-03-01T14:09:24.067 回答