拉拉维尔。两个项目的公共队列

mnv*_*mnv 3 php laravel laravel-5.2

我有两个不同的项目。Laravel 项目 A 和 Laravel 项目 B。我需要通过队列从项目 A 到项目 B 创建任务。我不想在项目 A 中为此创建工作。

目前我的认识是:

项目A

有状态但没有业务逻辑的工作:

<?php

namespace App\Jobs;

use ...;

/**
 * Fake class!!!
 */
class MyJob extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    public $queue = 'MyQueue';

    /**
     * Some state
     */
    protected $_contentId;

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

    /**
     * Excess. I dont need business logic in project A.
     */
    public function handle()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我在项目 A 中将作业推入队列:

    ...
    $this->dispatch(
        new MyJob($this->_contentId)
    );
    ...
Run Code Online (Sandbox Code Playgroud)

项目B

<?php

namespace App\Jobs;

use ...;

/**
 * Really needed class
 */
class MyJob extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    public $queue = 'MyQueue';

    /**
     * Some state
     */
    protected $_contentId;

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

    /**
     * Here is my business logic. In Project B!
     */
    public function handle()
    {
        Artisan::call('my_command', [
            'id' => $this->_contentId,
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,MyJob在Project A中没有怎么办?

Kol*_*ous 5

如果您将两个 laravel 应用程序连接到同一个队列服务器。您可以将作业放在其他站点队列中。例如,如果你在 Laravel A

$job = (new Job())->onQueue('theQueueForLaravelB')
dispatch($job);
Run Code Online (Sandbox Code Playgroud)

但是要完成这个,你应该做一个基本的工作,用参数数据发送一个新的。喜欢:

class DispatchNewJob implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    private $class_to_create;
    private $data;

    public function __construct($class_to_create, $data)
    {
        $this->class_to_create = $class_to_create;
        $this->data = $data;
    }

    public function handle()
    {
        dispatch(new $this->class_to_create($this->data));
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您现在可以将任何作业从 laravel A 发送到带有任何数据的 laravel B。

你可以打电话

$job = (new DispatchNewJob('App\Jobs\JobInLaravelB', ['data'=>'myawesomedata'])
               ->onQueue('LaravelBQueue');
dispatch($job);
Run Code Online (Sandbox Code Playgroud)

对不起我的英语,我来自阿根廷。