Odložení událostí v systému Laravel
Laravel poskytuje elegantní způsob, jak zpracovávat události v aplikacích. Co když ale chcete odeslání určitých událostí odložit až na dobu po dokončení provádění bloku kódu? V tom případě odložené události přijít.
V tomto příspěvku se seznámíme s tím, co jsou odložené události, proč jsou užitečné a jak je můžete implementovat do svých aplikací Laravel.
Co jsou odložené události v Laravelu?
Odložené události umožňují zpozdit odesílání událostí modelu a spouštění posluchačů událostí. až po dokončení konkrétní uzávěrky. Tato funkce je užitečná zejména tehdy, když potřebujete zajistit, aby byly všechny související záznamy v databázi vytvořeny a dostupné před spuštěním posluchačů událostí.
Vezměme si například scénář, kdy vytvoříte Order a okamžitě vytvořit OrderLineItemspojené s touto objednávkou. Pokud by byly události odeslány okamžitě, posluchači událostí by ještě nemuseli mít přístup ke všem souvisejícím záznamům.
Jak používat Event::defer()
Laravel usnadňuje odkládání událostí pomocí příkazu Event::defer() metoda. Stačí zabalit logiku do uzávěru:
use App\Models\Order;use Illuminate\Support\Facades\Event; Event::defer(function () { $order = Order::create(['order_number' => 'ORD-1001']); $order->lineItems()->create([ 'product_name' => 'Laptop', 'quantity' => 1, ]);});
Co se zde děje?
- Všechny události spuštěné uvnitř uzávěrky budou ve frontě.
- Jsou odesílány pouze po dokončení uzávěrky.
- Pokud uvnitř uzávěru dojde k výjimce, nebudou odeslány žádné události.
Tím je zajištěno, že posluchači událostí běží v čistém, předvídatelném stavu, kdy již existují všechny související záznamy.
Odložení pouze určitých událostí
Někdy nemusíte chtít odložit všechny události, ale pouze určité. Laravel to umožňuje tak, že předá pole názvů událostí jako druhý parametr příkazu defer().
Příklad:
use App\Models\Order;use Illuminate\Support\Facades\Event; Event::defer(function () { $order = Order::create(['order_number' => 'ORD-1001']); $order->lineItems()->create([ 'product_name' => 'Laptop', 'quantity' => 1, ]);}, ['eloquent.created: '.Order::class]);
Vysvětlení:
- V tomto případě se použije pouze
eloquent.createdudálost proOrdermodel bude odložen. - Další akce (jako např.
OrderLineItemmodel) bude odeslán okamžitě.
Kdy použít odložené události
Možná budete chtít události odložit, když:
- Vytváření souvisejících záznamů, u nichž posluchači závisí na dostupnosti všech záznamů.
- Provádění hromadných operací vkládání, které by měly spouštět události až po dokončení.
- Vyhnutí se problémům s nekonzistentním stavem v posluchačích událostí.
Závěr
Odložené události v systému Laravel umožňují účinně řídit, kdy se události spustí. Pomocí Event::defer(), můžete zajistit, aby posluchači měli vždy přístup ke konečnému, úplnému stavu vašich dat.
Ať už odkládáte všechny události v bloku kódu, nebo jen určité, tato funkce vám pomůže vytvářet spolehlivější a předvídatelnější aplikace řízené událostmi v Laravelu.