Команды и задания Laravel

мне было интересно, в чем разница между различными командными классами в Laravel 5.1. Насколько я могу судить, Laravel 5.1 имеет следующее:

  • консольные команды (artisan make:console)
  • команды (artisan make:command)
    • обработчики (artisan make::command --handler)
  • рабочих мест (artisan make:job)

я пришел прямо с 4.2 до 5.1, поэтому я не знаю, что произошло между 4.2 и 5.1, но я был сказал, что средний (просто команды) в основном не должны использоваться больше - они находятся в том, когда задания с возможностью очереди стали "командами" в 5.0, но Laravel с тех пор решил против этого, и они просто для совместимости. Тем не менее, я не на 100% по этому вопросу, поэтому уточнение было бы оценено.

мой конкретный вариант использования заключается в том, что я хочу место для размещения автономной "запускаемой" задачи. Например, что-то, что удалит файлы старше 5 дни из данного каталога (но он может сделать что угодно).

сначала это звучит как консольная команда - я хочу иметь возможность запускать ее из artisan, для начала. Но я также могу хотеть его по расписанию (отлично,artisan schedule:run запускает консольные команды). Но я также могу захотеть выполнить его асинхронно из кода. Консольные команды можно запускать синхронно С Artisan::call(), но для асинхронного, это (я думаю), где очереди приходят, и это внезапно должно быть работа.

Итак у нас есть работа. Теперь мы можем добавить его в очередь из кода, но как мы выполняем его как команду artisan (синхронно)? Могу ли я просто создать тонкую консольную команду и добавить DispatchesJobs черта (или код в нем), а затем отправить задание? Всегда ли задание должно идти в очереди, или мы можем заставить задание выполняться синхронно (и, в идеале, выводить на вывод консольной команды?) Тот же вопрос касается запуска его по расписанию - я должен создать эта консольная команда и добавьте ее в планировщик, или я могу заставить планировщик запустить задание напрямую?

и, наконец, у нас есть "команды", которые не являются консольными командами и не являются заданиями. Как я уже говорил, люди говорят мне, что это просто прихлебатели от изменения кода Laravel 5.0, которое было (своего рода) отменено. Но ... -Команда -8--> все еще существует для них, поэтому они не могут быть это мертв. Кроме того, в чем дело с командой самостоятельной обработки (по умолчанию поставляется с handle метод) и тот, который "требует" класс обработчика (run artisan make:command --handler)? Как вы на самом деле заставляете их выполнять? Вручную с помощью (new AppCommandSomeCommand)->handle(); или (new ApphandlersSomeCommandHandler)->handle(new AppCommandSomeCommand), или есть какая-то скрытая система, о которой я не знаю (возможно, их можно отправить с помощью диспетчера заданий/очередей)? Также вы можете создавать команды "queued"artisan make::command --queued, так чем же они отличаются?

я думаю, мой вопрос сводится к следующему:

  • что такое реальное (семантическое и функциональные) разница между ними всеми?
  • каков правильный способ "запустить" их?
  • что лучше для моих целей в целом автономного бит кода, который должен быть запущен, каким бы образом я не чувствовал себя подходящим?

я нашел информацию в документации о том, как использовать очереди и создавать консольные команды, но ничего о том, когда именно их использовать или действительно что-либо о классах команд и обработчиках.


связаны, но не совсем то же самое (Также, это без ответа):Laravel 5.1 команды и задания

3 ответов


Я вижу эти "объекты" так: (я добавил несколько примеров кода из одного из моих побочных проектов)

консоль

вещи, которые я хочу выполнить из командной строки (Как вы упомянули в своем примере с "удалить файлы старше x"). Но дело в том, что вы можете извлечь бизнес-логику из него команда.

пример: консольная команда с запускает команду для извлечения изображений из Imgur. Класс!--0--> содержит реальная бизнес-логика выборки изображений.

команда

класс, который содержит логику. Вы также должны иметь возможность вызывать эту команду из своего приложения с помощью app()->make(Command::class)->handle().

пример: команда, упомянутая в Примере 1. Содержит логику, которая выполняет фактические вызовы API Imgur и обрабатывает возвращенные данные.

рабочих мест

Я сделал это приложение с Laravel 5.0 так jobs тогда ничего не было. Но, как я вижу, Джобс похожи на команды, но они стоят в очереди и могут быть отправлены. (Как вы могли видеть в этих примерах, эти команды реализуют упомянутые вами интерфейсы SelfHandling и ShouldBeQueued).


Я вижу себя как опытный разработчик Laravel, но эти изменения в Commands и Jobs довольно трудно понять.

изменить: Из документов Laravel:

каталог app/Commands был переименован в app / Jobs. Тем не менее, вы не обязаны переместите все ваши команды в новое место, и вы можете продолжить использовать команды make:command и handler:command Artisan для создания ваших классов.

аналогично, каталог app / Handlers был переименован в app / Listeners и теперь содержит только прослушиватели событий. Однако нет необходимости перемещать или переименовывать существующие обработчики команд и событий, и можно продолжать использовать команду handler:event для создания обработчиков событий.

путем предоставления обратная совместимость для структуры папок Laravel 5.0 вы можете обновить свои приложения до Laravel 5.1 и медленно обновлять свои события и команды в новых местах, когда это удобно для вас или вашей команды.


Команды Консоли

Laravel имеет консольные "команды" в течение некоторого времени. Они практически не изменились и работают, как всегда. Проще говоря, они являются эквивалентом маршрутов для командной строки - точки входа в приложение. Они никоим образом не связаны...

Автобуса

Laravel 5.0 представил реализацию Command Bus pattern-команды командной шины. (Я считаю, что они были переименованы в Jobs из-за в результате путаница между ними и командами CLI).

командная шина как две части-объект, представляющий выполняемую команду, с любыми необходимыми данными (задание) и класс для выполнения команды (обработчик).

Проводник

в laravel вы можете объявить работу самостоятельной обработкой - то есть у нее есть сам метод дескриптора.

если вы хотите зарегистрировать обработчик команды, вы можете позвонить в службу провайдер:

app('Illuminate\Bus\Dispatcher')->maps(['Job' => 'Handler']);

где Job-имя класса для задания, а Handler-имя класса для обработчика.

каталог обработчиков в laravel 5.0 был способом неявного объявления этих отношений (т. е. EmailCommand в папке команд будет иметь EmailCommandHandler в папке обработчики).

отправка команды

вы можете использовать следующее для отправки команды.

app('Illuminate\Bus\Dispatcher')->dispatch(new EmailPersonCommand('email@you.com', $otherdata));

очереди

рабочих мест, по умолчанию будет выполняться, как только они будут вызваны (или отправлены). Установка их как ShouldQueue всегда передает их в очередь, когда они отправляются.

если вы хотите запускать их синхронно иногда и асинхронно в другое время, вы можете вызвать $dispatcher->dispatchToQueue($job) когда вы хотите, чтобы они были в очереди. Это все, что происходит внутри, когда вы передаете ShouldQueue задание ->dispatch().

edit: в очередь (или нет)

я только что посмотрел на диспетчера. Этот dispatch метод проверяет, является ли команда ShouldQueue, и направляет его в dispatchToQueue или dispatchNow. Вы можете вызвать любой из этих методов непосредственно вместо dispatch С вашей команды, если вы хотите переопределить поведение по умолчанию.

так что в вашем случае, в зависимости от того, что "по умолчанию" поведение ваша работа (то. это обычно в очереди?) любой: - есть!--5-->, и использовать dispatchNow в команде CLI. - нет ShouldQueue, и использовать dispatchToQueue где вы вызываете его в ваш код.


просто дополнение к фактическим ответам.

задания в Laravel >= 5.1 являются командами шины в Laravel 5.0.

это только изменение именования из-за путаницы между Console\Commands (команды выполняются с консоли) и Command Bus (содержащих Commands) для прикладных задач.

вы не должны посрамить :

  • Command Bus: используется для " инкапсуляции задач вашего приложения "(из laravel 5.0 doc), который теперь переименован а Jobs
  • Console\Commands: используется для " Artisan [...] интерфейс командной строки, включенный в Laravel" (из laravel 5.1 docs), который не изменяется в Laravel с 4.x