Команды и задания 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