使用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命令生成,这不是最佳选择默认情况下的方法(再次要求实施者足够精通以删除它)。
要明确这一点,当前的解决方案确实有效,但似乎代码气味要为每个类重复相同的行。
答案 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方法放在哪里。