我可以从作业表上的有效负载获取命令数据:
$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的值?
1条答案
按热度按时间djmepvbi1#
所以,正如我在评论中所说,你必须使用作业中间件,而不是阅读作业的内容(不是直接阅读)。
让我们在
app/Jobs/Middleware
中创建中间件,并将其命名为TenderChecker.php
:一定要设置正确的检查,我只是在这里给出一个例子。这个想法是检查是否应该执行作业,在您的情况下,如果
tender_id
模型没有被取消。我不知道您使用的是SoftDeletes
还是status
列,但要进行逻辑检查,如果通过检查,执行return $next($job);
,以便它继续检查中间件,直到不再有中间件并且到达正常执行的作业。现在,您的作业需要具有
middleware
方法:如果中间件通过了,那么作业就可以开始了,自动执行。如果中间件“失败”了,那么它就会删除作业,因为那是你想要检查/做的。
下面是Laravel官方中间件的一个示例(这样您就可以看到它们是如何使用/构建的):https://github.com/laravel/framework/tree/10.x/src/Illuminate/Queue/Middleware
这是官方文件:https://laravel.com/docs/10.x/queues#job-middleware