[英]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.