我相信如果我将一个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方法中决定如何处理它。 如果仅在一两个工作班级中需要这个,我可以在其他地方继续使用原始特征。
答案 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;
}