Laravel ShouldQueue它是如何工作的

Sum*_*per 9 php laravel

我知道如何使用ShouldQueue我的问题是为什么它的工作方式.

我需要编辑我new Job在数据库中的存储方式,因此正在挖掘Laravel的内部结构.

我要编辑的作业是从以下事件侦听器启动的:

<?php

namespace App\Listeners;

use App\Events\NewMail;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Jobs\SendEmail;
use Carbon\Carbon;
class NewMailListener implements ShouldQueue
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  NewMail  $event
     * @return void
     */
    public function handle(NewMail $event)
    {
       $addressee = $event->user->name;
       $address = $event->user->email;
       $type = "NewMail";
       $job = (new SendEmail($type,$addressee,$address))->delay(Carbon::now()->addMinutes(10));
       dispatch($job);
    } 
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是ShouldQueue魔法是如何工作的,因为在源代码中它似乎什么都不做.

<?php

namespace Illuminate\Contracts\Queue;

interface ShouldQueue
{
    //
}
Run Code Online (Sandbox Code Playgroud)

我知道这是一份合同,但它没有定义任何东西......所以它究竟在做什么?命名空间中是否发生了一些自动加载?

我不确定界面到底是什么,所以我看了一下:PHP Docs:Interfaces并且给人的印象是即使它是用于解耦,接口应该定义一些东西,我没有看到ShouldQueue.

该PHP文档页面的最高评论说:

提供了一个INTERFACE,您可以描述一组函数,然后在实现类中隐藏这些函数的最终实现.这允许您在不更改使用方式的情况下更改这些功能的实现.

但这里的功能描述在哪里?

PS - 我知道这个接口/契约用于对事件监听器本身进行排队,而不是我想要编辑的作业.但我希望了解队列与事件监听器的交互方式将更好地告诉我它如何适用于这些工作.

Ale*_*nin 12

内部Laravel检查Job或Mailable或Notification等是否实现了ShouldQueue接口.例如:

if ($job instanceof ShouldQueue) {
Run Code Online (Sandbox Code Playgroud)

https://github.com/laravel/framework/blob/5.5/src/Illuminate/Console/Scheduling/Schedule.php#L86