使用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();
}
答案 0 :(得分:0)
我发现了问题,因为问题始终不在我看的地方。事实证明,代码完全正常,但我忘了重新启动登台服务器上的队列工作程序,这意味着代码库中的更改未应用于队列工作程序。因此应用程序和队列使用了不同的版本。
甚至在Laravel Queue Documentation:
中说明了这一点请记住,队列工作程序是长期存在的进程,并将引导的应用程序状态存储在内存中。因此,他们在启动后不会注意到代码库中的更改。因此,在部署过程中,请务必重新启动队列工作程序。
我使用bugtracker Bugsnag,它显示错误以及代码中的行号。我注意到错误发生的行号与实际行号不匹配,但无法弄清楚这是导致问题的原因。