Odložení událostí včetně událostí modelu v Laravelu

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...

Poptat web

18. 08. 2025

Odložení událostí včetně událostí modelu v Laravelu

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.created událost pro Order model bude odložen.
  • Další akce (jako např. OrderLineItem model) 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.

Původní článek publikoval Nabil Hassen.