Проблема сериализации уведомлений Laravel

Я использую Laravel Notification для уведомления пользователей об определенных вещах. Все работает как положено, но в некоторых случаях я получаю следующую ошибку.

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

Когда я получил эти ошибки, я заметил, что у уведомляемых пользователей есть данные в столбце BLOB в таблице users. Я предполагаю, что по какой-то причине Laravel не может сериализовать значения, содержащиеся в столбце BLOB, и в результате я получаю ошибку, показанную выше.

На самом деле, если я изменяю значения этого столбца на NULL, процесс уведомления работает отлично. Я пытался использовать скрытые и приведенные свойства в модели User, но это не помогло.

Читая документацию, я не нашел способа изменить эту сериализацию, чтобы я мог заставить ее работать. Могу ли я изменить это поведение?

Я ценю ваши комментарии. Заранее спасибо!

1 ответ

Решение

Поскольку вы обнаружили, что JSON не принимает двоичные данные, уловка заключается в том, чтобы кодировать BLOB-объект в base64, чтобы его можно было использовать в JSON. Единственным недостатком является то, что вы должны декодировать его при извлечении JSON.

Вы можете использовать accessor в вашей модели, чтобы иметь возможность автоматически кодировать поле Blob, когда Модель сериализуется в JSON, то есть:

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

Вам нужно только помнить, чтобы декодировать BLOB, когда вы используете его в качестве реальных двоичных данных (например, если это изображение), то есть:

$blob = base64_decode($model->blob)

Или вы можете написать метод, который получает блоб без использования accessor:

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

Надеюсь это поможет.

Другие вопросы по тегам