英文:
How to get the specific data from jobs payload command in Laravel?
问题
我可以从作业表的负载中获取命令数据:
$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的值:
无法访问受保护的属性App\Notifications\TenderInProgress::$tender_id
如何获取tender_id的值?
英文:
I can get the command data from payload on jobs table:
$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);
The result is:
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: []
}
I can dump the value of id:
dd($command->notification->id)
But cannot dump the value of tender_id:
Cannot access protected property App\Notifications\TenderInProgress::$tender_id
How can I get the value of tender_id?
答案1
得分: 0
好的,以下是翻译好的部分:
所以,正如我在评论中所述,你必须使用作业中间件,而不是直接读取作业的内容。
让我们在 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\Jobs\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
英文:
So, as I have stated on the comments, you have to use a Job Middleware, not read the content of a job (not directly).
Lets create the middleware in app/Jobs/Middleware
and lets call it 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();
}
}
Do set the right check, I am just giving an example here. The idea is to check if the job should be executed, in your case, if tender_id
model is not cancelled. I have no idea if you are using SoftDeletes
or a status
column, but do the logical check and if it passes the check, do execute return $next($job);
so it continues checking middlewares until there are no more middlewares and reaches the job for normal execution.
Now, your job would need to have the middleware
method:
use App\Jos\Middleware\TenderChecker;
class YourJob
{
// ...
public function middleware()
{
return [new TenderChecker];
}
}
If the middleware passes, then the job is good to go and automatically executes . If the middleware "fails", then it will delete the job, because that is what you want to check/do.
Here is an example of Laravel's officials middlewares (so you can see how they are used/built): https://github.com/laravel/framework/tree/10.x/src/Illuminate/Queue/Middleware
And here is the official docs: https://laravel.com/docs/10.x/queues#job-middleware
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论