Laravel Job反序列化错误的类

时间:2017-09-11 09:01:14

标签: php laravel serialization deserialization jobs

使用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();
}

1 个答案:

答案 0 :(得分:0)

我发现了问题,因为问题始终不在我看的地方。事实证明,代码完全正常,但我忘了重新启动登台服务器上的队列工作程序,这意味着代码库中的更改未应用于队列工作程序。因此应用程序和队列使用了不同的版本。

甚至在Laravel Queue Documentation

中说明了这一点
  

请记住,队列工作程序是长期存在的进程,并将引导的应用程序状态存储在内存中。因此,他们在启动后不会注意到代码库中的更改。因此,在部署过程中,请务必重新启动队列工作程序。

我使用bugtracker Bugsnag,它显示错误以及代码中的行号。我注意到错误发生的行号与实际行号不匹配,但无法弄清楚这是导致问题的原因。