«Бизнес-логику» можно обрабатывать с помощью что угодно , поэтому кажется, что на самом деле спрашивают, какой вариант лучше повторить ту же бизнес-логику без повторения кода .
A Класс Job обычно выполняет одну вещь , как определено его методом handle()
.Трудно исключить задания из очереди из сравнения, поскольку их синхронный запуск обычно сводит на нет цель, заключающуюся в обработке медленных, дорогостоящих или ненадежных действий (таких как вызов веб-API) после текущего запроса был выполнени пользователю был показан ответ.
Если все задания должны были быть синхронными, это не сильно отличалось бы от определения функции для вашей бизнес-логики.Это на самом деле очень близко к тому, что выполняет диспетчеризация синхронного задания: где-то в стеке вызовов он запускает call_user_func([$job, 'handle'])
, чтобы вызвать единственный метод для вашего объекта задания.Что еще более важно, в синхронном задании отсутствует механизм для повторной попытки заданий, которые могли быть неудачными из-за внешних причин, таких как сбои сети.
Службы , с другой стороны,это простой способ инкапсулировать логику вокруг компонента , и они могут сделать более чем одну вещь .В этом контексте компонент может рассматриваться как часть вашего приложения, которую можно заменить на другую реализацию без необходимости изменять код, который его использовал.Прекрасным примером, включенным в платформу, является сервис Filesystem
(чаще всего доступ с помощью Storage
фасад).
Подумайте, не хранили ли вы книги, вставив их в базу данных, а вместо этогопутем публикации на внешний API.У вас может быть служба BookRepository , которая не только имеет метод store()
, но также имеет get()
, update()
, list()
, delete()
или любое количество других методов.Все эти запросы используют общую логику для аутентификации во внешнем веб-сервисе (например, добавление заголовков к запросам), и ваш класс BookRepository может инкапсулировать эту повторно используемую логику.Вы можете использовать этот класс обслуживания внутри запланированных ремесленных команд, веб-контроллеров, контроллеров API, заданий, промежуточного программного обеспечения и т. Д. - без повторения кода.
Используя этот пример, вы можете создать Задание для хранения новой книги, чтобы не заставлять пользователей ждать при медленном отклике API (и он может повторить попытку при сбое),Внутренне ваша работа вызывает ваш метод Service store()
при запуске.Работа, выполняемая службой, определяется заданием.