Десериализация Laravel Job неправильный класс

У меня проблема при использовании десериализации Laravel.
Это класс Job, который находится в очереди в базе данных:

class SendRatingEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

protected $order, $user;

public function __construct(User $user, Order $order)
{
$this->order = $order;
$this->user = $user;
}

public function handle()
{
if ($this->order->isRatedByUser($this->user->id)) {
return;
}
Mail::to($this->user->email)->queue(new RatingEmail($this->order, $this->user));
}
}

В классе Order.phpЯ отправляю эту работу так:

class Order {
function queueRating()
{
$when = Carbon::now()->addDays(env('ORDER_DAYS_RATING', 8));
dispatch((new SendRatingEmail($this->buyer, $this))->delay($when));
}
}

Так что проблема в работе handle() функция, в частности ошибка:

Call to undefined method Illuminate\Database\Query\Builder::isRatedByUser()

Кажется, что Laravel дает мне не тот объект, а не App\Order это дает мне QueryBuilder. в queueRating() Функция Я проверил, что типы, указанные в конструкторе, являются ожидаемыми типами. Я даже протестировал обходной путь, который также не работал:

if($this->order instanceof \Illuminate\Database\Query\Builder) {
$this->order = $this->order->first();
}

Также я посмотрел в таблице заданий, и кажется, что сохраненные модели верны (App\Order)

редактировать

Вот код, где queueRating() функция называется. Файл StripeController который обрабатывает платежи по кредитным картам.

public function orderPaid($order) {
$order->payment_done = 1;
$order->save();

$order->chat->open = 1;
$order->chat->save();

$order->queueRating();
}

2

Решение

Я нашел проблему, как всегда проблема не там, где я смотрел. Оказывается, с кодом все в порядке, но я забыл перезапустить работника очереди на промежуточном сервере, что означало, что изменения в кодовой базе не были применены в работнике очереди. Так что приложение и очередь использовали разные версии.

Это даже указано в Документация очереди Laravel:

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector