Štyri udalosti sú v RoundlyConsulting\Addresses\Events. Každá nesie jednu verejnú vlastnosť $address, používa Dispatchable a SerializesModels a implementuje ShouldDispatchAfterCommit:
| Udalosť | Odošle sa, keď |
|---|---|
AddressCreated | adresa vznikne cez balík — Addresses::for()->add(), save() v builderi, addAddress(), createAddress() alebo CreateAddressAction. |
AddressUpdated | Addresses::update() — UpdateAddressAction — upraví adresu. |
AddressDeleted | sa zmaže inštancia modelu Address — mäkko aj cez forceDelete(). |
PrimaryAddressChanged | sa adresa stane primárnou adresou svojho typu — setPrimary() či setPrimaryAddress(), pridanie s isPrimary: true alebo ->primary(), prípadne úprava s isPrimary: true — a restore(), keď sa zmazaná primárna adresa vráti ako primárna. Odošle sa po AddressCreated / AddressUpdated, keď je povýšenie zapísané; nie, ak adresa primárna už bola. |
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Addresses\Events\AddressCreated;
use RoundlyConsulting\Addresses\Events\PrimaryAddressChanged;
// e.g. in AppServiceProvider::boot()
Event::listen(function (AddressCreated $event): void {
$address = $event->address; // the new Address
$owner = $event->address->addressable; // its owner
});
Event::listen(function (PrimaryAddressChanged $event): void {
// e.g. recalculate shipping for $event->address->addressable
});Alebo použite samostatnú triedu listenera:
namespace App\Listeners;
use RoundlyConsulting\Addresses\Events\AddressUpdated;
final class RecalculateTaxOnAddressChange
{
public function handle(AddressUpdated $event): void
{
$owner = $event->address->addressable;
// recalculate tax for $owner
}
}Až po commite
Mimo transakcie sa udalosť odošle hneď po zápise. Vnútri transakcie vašej aplikácie počká na commit, v poradí, v akom zápisy prebehli, a rollback ju zahodí — listener tak nikdy nezareaguje na adresu, ktorá sa nikdy neuložila, ani na úpravu či zmazanie, ktoré sa vrátili späť:
use Illuminate\Support\Facades\DB;
use RoundlyConsulting\Addresses\Facades\Addresses;
DB::transaction(function () use ($customer, $data, $order): void {
Addresses::for($customer)->add($data); // AddressCreated is held back…
$order->save();
}); // …and dispatched here, once committedEvent::fake() zaznamená odoslanie okamžite, takže toto odloženie neukáže; overte ho skutočným listenerom cez Event::listen a transakciou.
Čo udalosti neodošle
- Priame zápisy cez Eloquent — $customer->addresses()->create([...]), $address->update([...]) — ani factories neodošlú AddressCreated ani AddressUpdated.
- Hromadné mazanie dopytom, napríklad $customer->addresses()->delete(), neodošle AddressDeleted.
- Povýšenie alebo opätovné uloženie adresy, ktorá už primárna je, neodošle PrimaryAddressChanged — pozrite Primárne adresy.
- Obnovenie, po ktorom sa adresa vráti ako bežná, lebo miesto medzitým obsadila iná primárna, neodošle PrimaryAddressChanged a restoreQuietly() neodošle nič.
Keďže udalosti používajú SerializesModels, listenery vo fronte dostanú Address znova načítanú z databázy.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.