Laravel 作业 - 在作业失败后从 failed() 方法访问修改后的属性值

Mar*_*874 6 php laravel

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

Tha*_*ars 0

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

<?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包含正在运行的作业,而不是序列化的构造作业