Laravel如何在执行前后调用作业类的方法

时间:2017-09-19 21:24:39

标签: php laravel laravel-5.4

使用laravel队列时遇到问题。由于我正在使用扩展架构,我所做的大部分工作都是使用队列和作业来实现的。例如,在处理大型文件时,会为文件中的每1000行创建一个作业,并将结果保存到输出文件中。

我有一个“Process”类,我目前正在用作作业的父级。进程类具有start()和end()方法,一旦调用了job handle()方法并且在执行方法之后应该调用这些方法。当前的解决方案是从handle方法调用这些方法,但问题是此解决方案增加了作业类本身中不必要的代码,并且由实现者来记住调用这些方法。

public function handle()
{
    $this->start(); // <- implementer has to remember to call this

    // Do the actual handle functionality

    $this->end(); // <- and this
}

所以我想知道是否有一种“干净”的方法,不需要来自job(child)类的父方法调用? 我尝试使用queue events,但无法从给定的事件对象构造作业类。来自工作的Dispatching an event并没有真正帮助,因为你仍然需要在每个工作类中添加这两个额外的行。

除了laravel特定的实现之外,我还研究了神奇的__call()方法,但这只有在“handle”方法不存在时才有效,考虑到artisan make:job命令生成,这不是最佳选择默认情况下的方法(再次要求实施者足够精通以删除它)。

要明确这一点,当前的解决方案确实有效,但似乎代码气味要为每个类重复相同的行。

2 个答案:

答案 0 :(得分:1)

您可以创建一个具有handle函数的父类,并且他将在具有您逻辑的子代中调用受保护的函数,例如:

class MyJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected function start() {
        // your start logic
    }

    protected function stop() {
        // your stop logic
    }

    protected function process() {
        // will be overrittten
    }

    public function handle() {
        $this->start();
        $this->process();
        $this->stop();
    }
}

你的所有工作都将扩展你的课程,例如:

class SpecificJob extends MyJob
{
    protected function process() {
         // logic
    }
}

答案 1 :(得分:0)

查看文档here以获取完成后调用的函数。我确定如果你四处搜寻,你会发现把BEFORE方法放在哪里。