我正在使用Laravel Notification来通知用户某些事情。一切都按预期工作,但在某些情况下,我得到下一个错误。
(1/1) InvalidPayloadException
Unable to JSON encode payload. Error code: 5
当我收到这些错误时,我注意到的事情是被通知的用户在users表的BLOB列中有数据。我的猜测是,由于某种原因,Laravel无法序列化BLOB列中包含的值,因此我得到上面显示的错误。
实际上,如果我将该列的值更改为NULL,则通知过程将完美运行。我尝试在User模型中使用隐藏和强制转换属性,但它没有帮助。
阅读文档我没有找到改变序列化的方法,所以我可以使它工作。有什么我可以改变这种行为吗?
感谢您的评论。提前致谢!
正如您自己发现的那样,JSON不接受二进制数据,这里的技巧是将BLOB编码为base64,因此可以在JSON中使用,唯一的缺点是在检索JSON时必须对其进行解码。
您可以在模型上使用accessor
,以便在使用JSON序列化模型时自动编码Blob字段,即:
// in User Model
public function getBlobAttribute($value)
{
return base64_encode($value);
}
当您将BLOB用作实际二进制数据时(例如,如果它是图像),您只需要记住解码BLOB,即:
$blob = base64_decode($model->blob)
或者你可以编写一个方法来检索blob而不使用accessor
:
// in User Model
public function getRawBlob()
{
$this->getOriginal('blob');
}
我希望这有帮助。