Laravel ShouldQueue它是如何工作的

时间:2018-01-21 18:17:52

标签: 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);
    } 
}

我不明白的是ShouldQueue魔法是如何起作用的,因为在source code它似乎无能为力。

<?php

namespace Illuminate\Contracts\Queue;

interface ShouldQueue
{
    //
}

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

我不确定界面到底是什么,所以我看了一遍:PHP Docs: Interfaces并且给人的印象是,即使它是用于解耦,界面应该是定义的东西,我不喜欢请参阅ShouldQueue

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

  

提供INTERFACE,以便您可以描述一组功能和   然后隐藏这些函数的最终实现   实施课程。这允许您更改实现   这些功能没有改变你如何使用它。

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

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

1 个答案:

答案 0 :(得分:11)

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

if ($job instanceof ShouldQueue) {

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