Laravel - Постановка подписчика на событие - когда методы подписчиков находятся в другом классе - PullRequest
1 голос
/ 22 марта 2019

Здравствуйте, хорошие разработчики,

Я пытался использовать решение из Этот вопрос , но он не решил мою проблему, поэтому я задаю его как отдельный вопрос.

TL;DR - Я хочу, чтобы слушатели моего подписчика выполнялись в очереди асинхронно. Мой подписчик вызывает метод из другого класса для каждого события. Я пытался добавить implements ShouldQueue в мой SubscriberClass | Мой класс слушателя | метод переименован в handle в каждом классе, но ничего не работает. они по-прежнему выполняются синхронно без очереди.

У меня есть класс подписчика на событие: TesterAPI. Я добавил его в массив EventServiceProvider subscribe.

У меня есть класс событий SourceAPIEvents

class SourceAPIEvents
{
    const PROJECT_CREATED = 'project.created';
    const PROJECT_PAUSED = 'project.paused';
    const PROJECT_RESUME = 'project.resume';
    const PROJECT_CLOSED = 'project.closed';

    public $project;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Project $project)
    {
        $this->project = $project;
    }
}

TesterAPI - Абонент

class TesterAPI implements ShouldQueue
{

    /**
     * Register the listeners for the subscriber.
     *
     * @param \Illuminate\Events\Dispatcher $events
     */
    public function subscribe($events)
    {
        $events->listen(
            SourceAPIEvents::PROJECT_CREATED,
            'App\Listeners\Internal\Project\SourceAPI\Tester\ProjectCreate@handle'
        );

        $events->listen(
            SourceAPIEvents::PROJECT_RESUME,
            'App\Listeners\Internal\Project\SourceAPI\Tester\ProjectResume@handle'
        );

        $events->listen(
            SourceAPIEvents::PROJECT_PAUSED,
            'App\Listeners\Internal\Project\SourceAPI\Tester\ProjectPause@handle'
        );

        $events->listen(
            SourceAPIEvents::PROJECT_CLOSED,
            'App\Listeners\Internal\Project\SourceAPI\Tester\ProjectClose@handle'
        );
    }
}

Вот мои классы слушателей:

class ProjectCreate extends TesterBase implements ShouldQueue
{
    public function handle(SourceAPIEvents $sourceAPIEvent)
    {
        //Do Something
    }

}

class ProjectPause extends TesterBase implements ShouldQueue
{
    public function handle(SourceAPIEvents $sourceAPIEvent)
    {
        //Do Something
    }

}

class ProjectResume extends TesterBase implements ShouldQueue
{
    public function handle(SourceAPIEvents $sourceAPIEvent)
    {
        //Do Something
    }

}

Я называю эти события вот так

event(SourceAPIEvents::PROJECT_CREATED, new SourceAPIEvents($project));

event(SourceAPIEvents::PROJECT_RESUME, new SourceAPIEvents($project));

Помогите мне понять, что я делаю неправильно.

...