在Laravel延迟队列作业中检查传递的对象是否存在

时间:2015-12-18 18:09:23

标签: laravel eloquent queue jobs

我相信如果我将一个Eloquent对象传递给延迟的Laravel工作a" findOrFail"方法被称为"恢复"对象并将其传递给我的Job类的控制器。

问题是,在实际处理作业时,表示对象的DB记录可能已经消失。

所以" findOrFail"甚至在调用"句柄"之前中止方法

一切似乎都很好。问题是现在的工作已经转移了#34;到失败的工作清单。我知道我可以手动将其从那里删除,但这听起来不对。

有没有办法知道"直接在我的工作类中,传递的对象"无法加载"或"不存在"或类似的东西?

基本上我希望能够做一些事情,如果" ModelNotFoundException"在重建的过程中被抛出"我传递的物品。

谢谢

SOLUTION:

根据Yauheni Prakopchyk的回答,我写了自己的特质并用它来代替SerializesModels,我需要改变它的行为。

这是我的新特点:

<?php

namespace App\Jobs;

use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Database\ModelIdentifier;
use Illuminate\Database\Eloquent\ModelNotFoundException;

trait SerializesNullableModels
{
    use SerializesModels {
        SerializesModels::getRestoredPropertyValue as parentGetRestoredPropertyValue;
    }

    protected function getRestoredPropertyValue($value)
    {
        try
        {
            return $this->parentGetRestoredPropertyValue($value);
        }
        catch (ModelNotFoundException $e)
        {
            return null;
        }
    }
}

就是这样 - 现在如果模型加载失败,我仍然会得到一个null,并且可以在我的handle方法中决定如何处理它。 如果仅在一两个工作班级中需要这个,我可以在其他地方继续使用原始特征。

1 个答案:

答案 0 :(得分:1)

如果我没弄错的话,你必须覆盖你职业班的getRestoredPropertyValue

protected function getRestoredPropertyValue($value)
{
    try{
        return $value instanceof ModelIdentifier
            ? (new $value->class)->findOrFail($value->id) : $value;
    }catch(ModelNotFoundException $e) {
        // Your handling code;
    }
    exit;
}