NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Lifecycle for Laravel

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áteNahraďte
Mapa prechodov a canTransitionTo() na enumetransition('confirm')->from(Status::Pending)->to(Status::Confirmed)
isFinal() na enumeterminal(Status::Completed, Status::Cancelled)
Akcia, ktorá prečíta stav, overí mapu a uložíLifecycles::for($model)->apply('confirm')
Udalosť StatusChanged odoslaná v transakciiLifecycleTransitioned (after commit)
Mapa časov paid → paid_atstate(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 behuttl() + 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óduability('approve') / actors(User::class)
Zmeny stavu z webhookov, ktoré môžu prísť dvakrátidempotencyKey("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 now

V 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 kryptomien

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