laravel5.5+框架中继承空接口的浅析及队列示例代码使用场景

2023-06-01 00:00:00 示例 队列 浅析

在面向对象开发中,实现空接口的意义是很重大的。抛开今后的可扩展性不谈,

在当前,laravel的空接口会判断有没有继承该接口来处理一些流程,

队列的这个空接口该说是有一个对应的处理流程的,比如:

if ($job instanceof SomeInterface) 

来做许多调度操作。


比如laravel队列规范 如下代码:

namespace Illuminate\Contracts\Queue;

interface ShouldQueue
{
   //
}

上面接口虽然是空的,但是有扩展空间(一般升级版本添加新功能),扩不扩展另说。 

如果要增加功能,添加规范接口,再让所有实体类实现新增接口,最后打个新版本发布。 

这是常见套路。重要的是规范的版本号,不同版本规范有不同功能,

实体类怎么实现的不重要,因为你实现了就有那些功能。


写程序的时候,定义一些接口,代表各种功能模块,互相依赖。

便于扩展。依赖于接口,只要是实现它的任意对象都可以。

写死具体某个对象是比较低级的做法。


laravel队列调度示例代码:

src/Illuminate/Console/Scheduling/Schedule.php
/**
 * Add a new job callback event to the schedule.
 *
 * @param  object|string  $job
 * @param  string|null  $queue
 * @param  string|null  $connection
 * @return \Illuminate\Console\Scheduling\CallbackEvent
 */
public function job($job, $queue = null, $connection = null)
{
    return $this->call(function () use ($job, $queue, $connection) {
   
        $job = is_string($job) ? Container::getInstance()->make($job) : $job;
       
        if ($job instanceof ShouldQueue) {
       
            // 走队列
            $this->dispatchToQueue($job, $queue ?? $job->queue, $connection ?? $job->connection);
       
        } else {
       
            // 现在执行
            $this->dispatchNow($job);
        }
       
    })->name(is_string($job) ? $job : get_class($job));
}

相关文章