首页 > 解决方案 > Laravel 作业 - 作业失败后从 failed() 方法访问修改后的属性值

问题描述

作业失败后,有没有办法在 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 []
    }
}

标签: phplaravel

解决方案


我遇到了同样的问题,没有找到本地解决方案。因此,我通过创建用于缓存数据的服务来解决此问题:

<?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;
    }
}

handle()我的工作班的方法中,我做了以下事情:

    /**
     * @return void
     */
    public function handle(): void
    {
        $jobFailService = JobFailService::factory();
        $jobFailService->job = $this;
    }

在这个failed()方法中:

/**
 * @param Exception $exception
 */
final public function failed(Exception $exception)
{
    $jobFailService = JobFailService::factory(); 
}

$jobFailService->job包含正在运行的作业,而不是序列化构造的作业


推荐阅读