作业失败后,有没有办法在 Laravel 作业中访问修改后的属性值?当我dd()在failed()作业处理过程中将项目推入方法中后丢失项目数组时,我得到返回的空数组的初始属性值,而不是将项目推入其中的数组。
如果无法做到这一点,是否可以创建自定义异常并接受自定义数据作为参数?然后我可以getData()向我的自定义异常添加一个方法并在其中调用它failed()以获取我修改后的属性值。
顺便说一句,我没有粘贴下面的实际工作类,因为它会很大,但这模拟了我希望实现的目标。
我希望我已经很好地解释了这一点。
任何建议表示赞赏。谢谢!
<?php
namespace App\Jobs;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Mail;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class PushOrdersToAnotherService implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $missingItems = [];
public function handle()
{
// ...
if (true) {
$this->missingItems[] = ['name' => 'Some item'];
throw new Exception('Items were missing', 400);
}
}
public function failed(Exception $exception)
{
dd($this->missingItems); // Returns []
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,但没有找到本地解决方案。因此,我通过创建一个用于缓存数据的服务来解决这个问题:
<?php
namespace App\Services;
use App\Jobs\Job;
class JobFailService
{
/**
* @var Job
*/
public $job;
/**
* @var JobFailService
*/
private static $instance;
/**
* @return JobFailService
*/
public static function factory()
{
if (!self::$instance)
{
self::$instance = new self();
}
return self::$instance;
}
}
Run Code Online (Sandbox Code Playgroud)
在handle()我的工作课程的方法中,我执行了以下操作:
/**
* @return void
*/
public function handle(): void
{
$jobFailService = JobFailService::factory();
$jobFailService->job = $this;
}
Run Code Online (Sandbox Code Playgroud)
在failed()该方法中:
/**
* @param Exception $exception
*/
final public function failed(Exception $exception)
{
$jobFailService = JobFailService::factory();
}
Run Code Online (Sandbox Code Playgroud)
$jobFailService->job包含正在运行的作业,而不是序列化的构造作业