Ошибка сериализации уведомлений по электронной почте и ошибка объекта запроса, пропущенная с ShouldQueue - PullRequest
0 голосов
/ 22 декабря 2019

У меня есть класс уведомлений Laravel, который отправляет электронную почту группе получателей. Без ShouldQueue это прекрасно работает при использовании объекта $request, который я передаю в конструктор класса уведомлений :

class MassNotification extends Notification {
     public function __construct($request)
     {
        $this->request = $request;
     }

Это происходит от контроллера вот так:

\Notification::send($emps, new MassNotification($request));

Мне нужно поставить в очередь эти электронные письма, чтобы освободить пользователя для продвижения, поэтому я реализую ShouldQueue:

class MassNotification extends Notification implements ShouldQueue {}

На этом этапесообщения терпят неудачу со следующей ошибкой:

Сериализация 'Closure' не разрешена

Выполнение небольшого SO поиска , и здесь говорит мне, что это связано с невозможностью сериализации объекта $request. Хорошо, я следую совету и изменяю конструктор, чтобы получить массив данных, которые мне нужны:

public function __construct($request)
 {
    $this->request = $request->all();
 }

Я изменяю код в моем toMail(), чтобы он соответствовал нотации массива и нотации объекта, и этопроисходит сбой каждый раз , прежде чем он попадает в метод toMail() с:

Вызов функции-члена has () имеет значение null по адресу /vagrant/app/Notifications/MassNotification.php: 44

Однако, это указывает на мой код - но у меня больше нет кода has(), он никогда не доходит до этой строки - он терпит неудачу в Illuminate\\Notifications\\Channels\\MailChannel->send() Я полагаю.

Я пытался полностью вывести массив запросов и просто использовать переменные (например, $this->message, $this->subject и т. Д.), Но Notification, похоже, ищет объект для использования has() каждый раз.

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

1 Ответ

1 голос
/ 22 декабря 2019

Если вы столкнулись с ситуацией, когда кажется, что обновления вашего кода отсутствуют, и ваши ошибки не соответствуют текущему коду, а вы используете задания в очереди, то необходимо перезапустить рабочих. Работники очереди работают в режиме демона и сохраняют загруженное состояние приложения в памяти. Они не увидят изменений, которые вы вносите в код.

"Помните, что работники очереди являются долгоживущими процессами и сохраняют состояние загруженного приложения в памяти. В результате они не заметят изменений вваша база кода после того, как они были запущены. Поэтому, во время процесса развертывания, обязательно перезапустите работников очереди ». - Документы Laravel 6.x - Очереди - Запуск работника очереди

...