Laravel 检查作业是否扩展了某个 class

Laravel check if job extends a certain class

我知道您可以使用 beforeafterfailing 挂钩来收听工作事件:

https://laravel.com/docs/5.6/queues#job-events

Queue::before(function (JobProcessing $event) {
    // $event->connectionName
    // $event->job
    // $event->job->payload()
});

不过,我只希望某些工作可以在这里完成。这些作业是从称为 AbstractTask 的某个抽象基础 class 扩展而来的。通常我会简单地执行 instanceof 检查,但像这样的东西是行不通的:

$job instanceof AbstractTask

有什么方法可以将工作标记为由这些工作事件选择?

编辑

似乎我想要的实际工作(这是我自己的工作 class)可以在 $event->job 中找到,如下所示:

$payload = json_decode($job->getRawBody());
$data = unserialize($payload->data->command);

if ($data instanceof AbstractTask) {
    dd($data);
}

我很难相信没有更简单的方法来获取实际正在处理的底层作业,所以我也提出了一个 Github 问题:

https://github.com/laravel/framework/issues/25189

顺便说一句,我在你的问题上发帖了。

你能试试这个,看看 resolveName 是否给你正确的 class 名字 job/task:

Queue::before(function (JobProcessing $event) {
    $class = $event->job->resolveName();

    // without an instance
    if (is_a($class, AbstractTask::class, true)) {
        ...
    }

    // with an instance
    $instance = app($class);

    if ($instance instanceof AbstractTask) {
        ...
    }
});