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

Posted

技术标签:

【中文标题】Laravel 作业 - 作业失败后从 failed() 方法访问修改后的属性值【英文标题】:Laravel jobs - Accessing modified property values from failed() method after job has failed 【发布时间】:2018-12-30 22:13:57 【问题描述】:

有没有办法在作业失败后访问 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】:

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

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

【讨论】:

以上是关于Laravel 作业 - 作业失败后从 failed() 方法访问修改后的属性值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 排队事件侦听器与作业之间的区别

Laravel:把工作推到失败的桌子上

在 laravel 调度程序中重新运行作业

我可以在 Laravel 中处理作业超时吗?

在 SQL Server syspolicy_purge_history 作业中,第 3 步失败

如何将链式作业分派到 Lumen 6 中的队列?