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

时间:2018-07-23 12:44:20

标签: 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 []
    }
}

1 个答案:

答案 0 :(得分: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;
    }
}

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