簡體   English   中英

Laravel 作業 - 作業失敗后從 failed() 方法訪問修改后的屬性值

[英]Laravel jobs - Accessing modified property values from failed() method after job has failed

作業失敗后,有沒有辦法在 Laravel 作業中訪問修改后的屬性值? 當我在處理作業時將項目推入failed() dd()中的缺失項目數組后,我得到返回的空數組的初始屬性值,而不是包含推入其中的項目的數組。

如果無法做到這一點,是否可以創建自定義異常並接受自定義數據作為參數? 然后我可以將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 []
    }
}

我遇到了同樣的問題,沒有找到本地解決方案。 因此,我通過創建用於緩存數據的服務來解決此問題:

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

1.) 您可以簡單地將$missingItems變量定義為靜態變量,如下所示。

protected static $missingItems = [];

2.) 您可以在handle()函數中修改它,如下所示。

public function handle()
{
  // ...

  if (true) {
    self::$missingItems[] = ['name' => 'Some item'];
    throw new Exception('Items were missing', 400);
  }
}

3.) 然后你可以檢查failed()函數內部,如下所示。

public function failed(Exception $exception)
{
  dd(self::$missingItems); // Returns ['name' => 'Some item']
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM