Laravel 5.1 - Return 来自工作的数据?

Laravel 5.1 - Return Data from Jobs?

我刚开始在 Laravel 5.1 中使用作业,想知道从作业中 return 数据是否是一个好习惯?我还没有看到任何这样的例子,但这是一个场景。假设它是用户之间的内部消息系统:

// Controller Method 
public function store(Request $request)
{
     if (!$this->messageValidator->isValid($request->all())) {
          return redirect()->back()->withInput()->withErrors($this->messageValidator->getErrors());
      }

      $this->dispatchFrom(PostMessage::class, $request, [ 'user' => Auth::user() ]);

      return redirect('messages');
}

所以 Job 将获取请求数据和 User,并将执行多个任务

// In the PostMessage Job

public function handle( // dependencies here)
 {
       // Create a new Thread

      //  Add Message to the Database

      // Store Recipients of Message in the Database 

      // Send email notifications to all involced

     return $message_id;
}

在 handle() 方法的末尾,我 return 编辑了 $message_id 以便我可以将它用于控制器中的重定向:

return view('messages.show', $message_id);

这是一种可接受的做法,还是乔布斯旨在以更孤立的方式执行任务?

或者乔布斯的用处不大?

通常,作业用于您可能希望在后台(异步)排队到 运行 的事物,因此从它们那里接收 return 值有点奇怪。

我会把保存的数据库移到别处,并且只将作业用于电子邮件通知:

// Controller Method 
public function store(Request $request, MessageGuru $messageGuru)
{
    if (!$this->messageValidator->isValid($request->all())) {
        return redirect()->back()->withInput()
                   ->withErrors($this->messageValidator->getErrors());
    }

    $messageId = $messageGuru->store($request->all());

    $this->dispatchFrom(PostMessage::class, $request, [ 'user' => Auth::user() ]);

    return view('messages.show', $messageId);
}

// MessageGuru
class MessageGuru {

    public function store ($input) {
        //  Add Message to the Database

        // Store Recipients of Message in the Database 
    }
}

// In the PostMessage Job
public function handle()
{
    // Send email notifications to all involved
}

我确实检查了 Laravel 源代码,如果作业没有排队,作业的 return 值确实是 returned,但是以这种方式使用作业会限制您稍后将其重构为排队作业。

简答:没有。

工作就是这样:一份可以 运行 没有上下文的工作。您现在应该可以 运行 找到一份工作,几秒钟后,或者一年后。你给一个作业一些数据,它应该在未来任何时候都可以执行。

如果您需要 return 数据,可以考虑在作业执行期间引发事件。如果您需要某事发生后的价值,请考虑使用命令或服务对象。

因为 Laravel 5 根据文档,命令已替换为作业。这是官方的故事。非正式地还有命令和工作。

Commands extend Command class,Jobs the Job class。我自己都用。命令触发 Laravel 从命令行和作业到队列任务的东西。

我实际上正在寻找一种可能性,即在 运行 时从排队的作业中检索数据并在另一个作业中使用它。这个线程提示,命令或事件或共享对象可能会起作用,但我必须自己弄清楚架构。

我不认为已接受的答案能准确回答问题...相反,它提供了 'better' 方法(我同意)。我想尝试自己回答问题,所以我加了 2 美分。

在 Laravel 中,您可以选择要将作业发送到的连接。

因此,您绝对可以对排队(异步)作业使用默认连接,正如版本 5 的预期一样,并使用 'sync' 连接对任何 'command-bus-like' 以前版本的内容。

您甚至可以添加一个新连接并随意命名它(例如 'bus')并让它使用 'sync' 驱动程序,这样它会更清晰,这样您就可以在用于本地测试的 'sync' 连接和您寻找的命令总线目的之间有区别。

然后您只需指定在发送作业时要使用的连接:

ProcessPodcast::dispatch($podcast)->onConnection('bus');

有时我也想念命令总线的想法,以及如何使用它:-)

希望对您有所帮助!