Migrácia zo status enumov
Väčšina aplikácií začína stĺpcom status, backed enumom a niekoľkými ručne písanými kontrolami. Bežné vzory sa na balík prenesú takto — zámky riadkov, zápisy cez compare-and-swap aj obnovenie modelu v pamäti po zlyhaní sú zabudované:
| Máte | Nahraďte |
|---|---|
| Mapa prechodov a canTransitionTo() na enume | transition('confirm')->from(Status::Pending)->to(Status::Confirmed) |
| isFinal() na enume | terminal(Status::Completed, Status::Cancelled) |
| Akcia, ktorá prečíta stav, overí mapu a uloží | Lifecycles::for($model)->apply('confirm') |
| Udalosť StatusChanged odoslaná v transakcii | LifecycleTransitioned (after commit) |
| Mapa časov paid → paid_at | state(Status::Paid)->stamps('paid_at') |
| Vedľajšie efekty v akcii (sklad, kredity) | handledBy(SellStock::class) + CompensatesTransition |
| Stav Scheduled a príkaz „zverejni naplánované“ | Lifecycles::for($post)->schedule('publish', $at) |
| Stav odvodzovaný z expires_at pri každom čítaní | expiresAtAttribute('expires_at')->expiresVia('expire') |
| Príkaz „čoskoro vyprší“, ktorý upozorní pri každom behu | ttl() + warnBefore() + renew() |
| Počítadlá „znovu otvoriť najviac 3-krát“ | maxOccurrences(3) |
| Zoznamy schvaľovateľov či rolí overované len v niektorých cestách kódu | ability('approve') / actors(User::class) |
| Zmeny stavu z webhookov, ktoré môžu prísť dvakrát | idempotencyKey("provider:{$eventId}") |
Predtým a potom
// Before
public function execute(Appointment $appointment, Status $to): void
{
if (! $appointment->status->canTransitionTo($to)) {
throw new InvalidTransition;
}
$appointment->update(['status' => $to]);
event(new AppointmentStatusChanged($appointment, $to));
}
// After
$appointment->transitionTo(Status::Confirmed);
Lifecycles::for($appointment)->by($vet)->because('Patient did not come')->apply('mark_no_show');Presun existujúcej tabuľky
- 1. Nainštalujte balík, nastavte typy kľúčov, publikujte a spustite migrácie.
- 2. Napíšte definíciu so stavmi, ktoré už stĺpec obsahuje — enum si ponechajte a použite ho priamo (states(Status::class)), potom ju zvalidujte voči tabuľke.
- 3. Urobte z modelu subjekt (implements LifecycleSubject, use HasLifecycle, lifecycleDefinitions()). Nové riadky odteraz dostávajú záznamy aj históriu automaticky.
- 4. Existujúce riadky prevezmite cez lifecycle:adopt: každý riadok dostane záznam, jeho uložený stav sa prevezme a stavy NULL sa zmenia na počiatočný stav. Prevzaté pobyty začínajú teraz; pri stavoch s TTL zabráni --no-expiry naplánovaniu expirácie pre všetky staré riadky naraz. Príkaz sa dá spustiť opakovane.
- 5. Ručne písaný kód prechodov nahraďte apply() / transitionTo(). So zapnutým strict_writes teraz priame $model->status = …; save() vyhodí výnimku; updaty cez query builder sa prevezmú pri ďalšej zmene.
- 6. Vedľajšie efekty presuňte do handlerov (v transakcii) alebo listenerov LifecycleTransitioned (po commite, pre e-maily a externé volania).
- 7. Ak ste pridali TTL alebo plány, naplánujte sweep.
- 8. Kontroly v rozhraní nahraďte can() / allowedTransitions() alebo LifecycleResource a validáciu formulárov pravidlom ValidTransition.
php artisan lifecycle:validate "App\Models\Order:status"
php artisan lifecycle:adopt "App\Models\Order" --no-expiry # or without --no-expiry to start TTLs nowV seederoch a factories je vytvorenie modelu s ľubovoľným deklarovaným stavom povolené a zaznamenané. Zmena stavu už uloženého modelu v afterCreating alebo v seederi vyžaduje Lifecycles::allowDirectWrites() (prevezme sa okamžite), prípadne spustite seeder s LIFECYCLE_STRICT_WRITES=false.
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.