Command (Команда) - запит на дію оформлюється окремим об'єктом, що містить усе потрібне для виконання: що зробити і з якими даними. Тоді дію можна передати, відкласти, поставити в чергу, повторити, записати в журнал чи скасувати.
Laravel-джоба - класичний Command:
final class GenerateInvoicePdf implements ShouldQueue
{
use Queueable;
public function __construct(public Invoice $invoice) {}
public function handle(PdfRenderer $renderer): void
{
$this->invoice->update(['pdf_path' => $renderer->render($this->invoice)]);
}
}
GenerateInvoicePdf::dispatch($invoice); // виконати пізніше в черзі
GenerateInvoicePdf::dispatchSync($invoice); // виконати зараз
- об'єкт-команда містить дані (
$invoice) і знає, що робити (handle); - виконавець (воркер черги) не знає деталей - просто викликає
handle; - відправник не знає, коли й де команда виконається.
Що дає такий підхід:
- відкладене й асинхронне виконання - черги;
- повтори при збоях (
$tries,backoff) - команда серіалізується й виконується знову; - ланцюжки й пакети:
Bus::chain([...]),Bus::batch([...])- послідовність команд як дані; - журнал: кожна команда - запис у черзі з параметрами, спробами, помилками (Horizon);
- middleware для команд (
RateLimited,WithoutOverlapping) - спільна поведінка навколо будь-якої команди.
Інші Command у Laravel: Artisan-команди, дії (action-класи з одним методом handle/__invoke), Pipeline з об'єктами-кроками.
Command + скасування (класичний варіант патерну): команда має execute() і undo() - основа функцій «Скасувати» в редакторах. У вебзастосунках частіше роблять компенсуючі дії (повернення коштів, а не «відкат» оплати).
CQRS-підхід з шиною команд: контролер створює команду PlaceOrder, шина знаходить обробник PlaceOrderHandler. Це розділяє «що потрібно зробити» і «як», але додає шар непрямості - доречно у великих доменах, а в звичайному Laravel-застосунку часто досить action-класів.
Важливо для черг: команда має бути ідемпотентною або захищеною від повторного виконання (ShouldBeUnique, перевірка стану) - повтори при збоях і «at least once» доставка можуть виконати її двічі.