2016-08-15 3 views
0

Как вы переключаетесь между ShouldQueue и Sync в классе?Переключатель Laravel между Queue, а не Queue

У нас есть конечная точка, которая принимает аргумент, следует ли немедленно или позже уволить работу.

В обоих случаях должна выполняться одна и та же логика, но в одном сценарии я ожидаю ответа и обратно, а другой должен обрабатываться async.

Мне известно о внедрении «ShouldQueue» и использовании «InteractsWithQueue» -Trait, но как мы можем использовать это в одной ситуации и не использовать его в другом?

Можете ли вы программно установить, должен ли запрос быть поставлен в очередь или нет, или есть ли лучшие способы сделать это? Благодаря

+0

не проверял это еще сам, но может вы создаете экземпляр класса задания, и если он должен быть запущен немедленно или «онлайн», а затем просто вызовите метод 'handle()' в вашем контроллере? Если вы хотите запустить его в очереди или «в автономном режиме», вы можете использовать диспетчер для его очереди в обычном режиме. – stratedge

+0

@xjstratedgebx да, это работает, но как мне передать переменную в обоих случаях? В случае диспетчера ожидается, что в конструкторе в ручке будет обработан метод. – hogan

+0

Если вы разрешите класс задания через контейнер службы (т. Е. '$ Job = app (\ App \ Jobs \ MyJob :: class);'), любые классы, которые вы вводите в конструкторе, будут автоматически переданы вам. Если вы вызываете 'handle()' вручную, и для этого требуется передать параметры, просто передайте параметры, когда вы его вызываете. Не нужно беспокоиться об этих параметрах, когда вы его ставите в очередь - я считаю, что контейнер службы будет автоматически вводить параметры при его запуске из очереди. – stratedge

ответ

2

В контроллере:

$this->dispatch($job) // queued if implements ShouldQueue 

$this->dispatchNow($job) // never queues 

Если застрял на Laravel 5.1, создать новый экземпляр Dispatcher себя:

use Illuminate\Contracts\Bus\Dispatcher; 

// Later ... 

app(Dispatcher::class)->dispatchNow($job); 
+0

Привет, Джозеф, это было хорошо, чтобы быть правдой. dispatchNow не является функцией. Нужно ли мне что-нибудь еще для этого? – hogan

+0

@hogan, какую версию Laravel вы используете? Это по крайней мере в 5.2 (см. [Здесь] (https://laravel.com/api/5.2/Illuminate/Foundation/Bus/DispatchesJobs.html#method_dispatchNow)). Все, что он делает, это app (\ Illuminate \ Contracts \ Bus \ Dispatcher :: class) -> dispatchNow ($ job); –

+1

@hogan - если вы обновили версию более ранней версии Laravel, обязательно используйте символ «Illuminate/Foundation/Bus/DispatchesJobs» в вашем контроллере. –