在Laravel中使用原始json队列消息

jsz*_*ody 9 php laravel

通常Laravel期望它排队后来消耗的任何消息.它创建一个带有job属性的有效负载,该属性稍后指示如何处理队列消息.当您使用Laravel排队工作,然后使用Laravel处理它们时,效果很好!

但是,我有一些非Laravel应用程序将json消息发布到队列中.我需要Laravel来获取这些消息并处理它们.

我可以编写一个命令总线作业来处理消息,但我无法弄清楚如何告诉queue:work将消息发送到我的特定处理程序.

似乎Laravel有一个很难的假设,即它要求处理的任何队列消息都将按照预期的方式进行适当的格式化,序列化和结构化.

我怎样才能让Laravel获取这些原始的json有效负载,忽略结构(没有任何东西可供理解),只需将有效负载交给我的处理程序?

例如,如果我有一个类似于的队列消息:

{
    "foo" : "bar"
}
Run Code Online (Sandbox Code Playgroud)

再说一遍,Laravel 没有什么可以在这里检查或理解的.

但我有一个知道如何处理这个的工作处理程序:

namespace App\Jobs;

class MyQueueHandler {
    public function handle($payload) {
        Log::info($payload['foo']); // yay!
    }
}
Run Code Online (Sandbox Code Playgroud)

现在如何获得queue:workqueue:listen简单地将任何有效负载交给这个App\Jobs\MyQueueHandler处理程序,我可以自己完成其余的工作?

Mar*_*son 0

您没有指定 Laravel 的版本,所以我猜测是 5.1(L4.2 和 L5.x 中的处理方式存在巨大差异)。

如果您已经设置了App\Jobs\MyQueueHandler,并且想要使用您想要的任何数据从控制器对作业进行排队,您可以这样做:

use App\Jobs\MyQueueHandler;

class MyController 
{
    public function myFunction() 
    {
        $this->dispatch(new MyQueueHandler(['foo' => 'bar']));
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的MyQueueHandler类中,有效负载实际上进入您的构造函数。不过,当您的队列被处理时,句柄方法仍然会被触发。handle但是,如果您依赖依赖注入,您可以在您的方法上使用参数(在此处阅读更多内容,就在“当事情出错时”上方),因此应该这样做:

namespace App\Jobs;

class MyQueueHandler 
{

    protected $payload;

    public function __construct($payload)
    {
        $this->payload = $payload;
    }

    public function handle() {
        Log::info($this->payload['foo']); // yay!
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您想从主控制器(继承自标准类)外部分派作业App\Http\Controller,请使用DispatchesJobs特征;

MyClass 
{
    use DispatchesJobs;

    public function myFunction()
    {
        $this->dispatch(new MyQueueHandler(['foo' => 'bar']));
    }
}
Run Code Online (Sandbox Code Playgroud)

(代码使用 Laravel 5.1.19 和 beanstalkd 队列适配器进行测试)。