如何从Laravel中的作业有效载荷命令获取特定数据?

icnyk63a  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(118)

我可以从作业表上的有效负载获取命令数据:

$job = DB::table('jobs')->first();
$payload = json_decode($job->payload);
$raw_command = json_decode($job->payload)->data->command;
$command = unserialize($raw_command);
dd($command->notification);

结果是:

App\Notifications\TenderInProgress {#1527 ▼
  +id: "0788ee9a-62c2-4280-9954-fc1d679228a8"
  +locale: null
  #tender_id: 5
  +connection: null
  +queue: null
  +chainConnection: null
  +chainQueue: null
  +chainCatchCallbacks: null
  +delay: Carbon\Carbon @1678173780 {#1528 ▶}
  +afterCommit: null
  +middleware: []
  +chained: []
}

我可以转储id的值:dd($command->notification->id)
但无法转储tender_id的值:无法访问受保护的属性应用程序\通知\正在进行的招标::$tender_id
如何获得tender_id的值?

djmepvbi

djmepvbi1#

所以,正如我在评论中所说,你必须使用作业中间件,而不是阅读作业的内容(不是直接阅读)。
让我们在app/Jobs/Middleware中创建中间件,并将其命名为TenderChecker.php

<?php
 
namespace App\Jobs\Middleware;
 
class TenderChecker
{
    public function handle($job, $next)
    {
        if (Tender::findOrFail($job->tender_id)->status !== 'cancelled') {
            return $next($job); 
        }

        $job->delete();
    }
}

一定要设置正确的检查,我只是在这里给出一个例子。这个想法是检查是否应该执行作业,在您的情况下,如果tender_id模型没有被取消。我不知道您使用的是SoftDeletes还是status列,但要进行逻辑检查,如果通过检查,执行return $next($job);,以便它继续检查中间件,直到不再有中间件并且到达正常执行的作业。
现在,您的作业需要具有middleware方法:

use App\Jos\Middleware\TenderChecker;

class YourJob
{
    // ...
    public function middleware()
    {
        return [new TenderChecker];
    }
}

如果中间件通过了,那么作业就可以开始了,自动执行。如果中间件“失败”了,那么它就会删除作业,因为那是你想要检查/做的。
下面是Laravel官方中间件的一个示例(这样您就可以看到它们是如何使用/构建的):https://github.com/laravel/framework/tree/10.x/src/Illuminate/Queue/Middleware
这是官方文件:https://laravel.com/docs/10.x/queues#job-middleware

相关问题