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

Dajte stavu TTL, voliteľnú ochrannú lehotu a predstihy upozornení a pomenujte systémový prechod, ktorý sa pri expirácii spustí:

$lifecycle->state(ListingStatus::Active)
    ->ttl('30 days')               // or ->ttl(fn (Listing $l) => $l->plan->duration) or ->expiresAtAttribute('ends_at')
    ->grace('3 days')              // the expire transition runs at expires_at + grace
    ->warnBefore('7 days', '1 day')
    ->expiresVia('expire');        // a systemOnly() / allowSystem() transition leaving the state

Vstup do stavu naplánuje jeho expiráciu. Odchod zo stavu ju zruší a návrat naplánuje novú. Pre jeden pobyt v stave pochádza okamih z expireAt() (ak je nastavené), inak z atribútu expirácie, inak z TTL. Expiračný prechod sa spustí v čase expires_at + grace ako systémový prechod cez lifecycle:sweep.

Closure pre TTL dostane subjekt a vráti interval (od teraz), okamih alebo null (pre tento pobyt bez expirácie). Pri expiresAtAttribute() zmena stĺpca pri bežnom uložení modelu znova zosynchronizuje čakajúcu expiráciu, pokiaľ pre pobyt neplatí prepis (expireAt(), extend(), renew()) alebo neverExpire(). Synchronizácia vychádza zo stavu uloženého riadku, takže zastaraný model, ktorý sa stále považuje za model v expirujúcom stave, nič nenaplánuje; expirácia soft-deleted subjektu sa riadi atribútom tiež a zostane pozastavená.

Prechod do toho istého stavu zachová expiráciu z TTL (intervalu alebo closure). Expirácia z atribútu sa naopak riadi atribútom, takže handler, ktorý atribút počas takého prechodu posunie, sa zohľadní, a expirácia zrušená cez neverExpire() zostane zrušená.

Čítanie a zmena expirácie

$handle = Lifecycles::for($listing);

$handle->expiresAt();                  // CarbonImmutable (UTC) or null
$handle->isExpired();                  // expires_at has passed (the sweep may not have run yet)
$handle->isInGrace();                  // expired, but the expire transition is not due yet
$handle->isExpiringWithin('3 days');
$handle->effectiveState();             // ListingStatus::Expired the moment expires_at passes
$handle->state();                      // the model's attribute as loaded, even when the expiry is overdue

$handle->extend('7 days');             // expires_at + 7 days
$handle->renew();                      // now + the state's TTL (or ->renew('14 days'))
$handle->expireAt(now()->addWeek());   // an absolute instant for this stay
$handle->neverExpire();                // no expiry for this stay

Každá zmena nahradí čakajúcu expiráciu, takže upozornenia začnú odznova. neverExpire() platí počas celého pobytu: kým subjekt zostáva v stave, expiráciu nevráti ani neskoršia zmena atribútu expirácie, ani prechod do toho istého stavu. extend() potrebuje čakajúcu expiráciu, renew() interval alebo TTL a expireAt() stav, ktorý môže expirovať — inak vyhodia ExpiryException. Zmeny expirácie sa neoverujú voči pravidlám definície; aktér, ak je zadaný, sa len zaznamená, preto tieto volania autorizujte vlastnými policies.

Upozornenia

warnBefore() odošle LifecycleExpiring raz za každý predstih (subject, lifecycle, state, expiresAt, lead, scheduleId), strážené cez compare-and-swap, takže dva súbežné sweepy ho odošlú len raz. Predstihy, ktoré uplynuli naraz, sa odošlú raz s najbližším z nich a po expirácii sa už žiadne upozornenie neodošle. Upozornenie, ktoré vyhodí výnimku, sa nahlási vášmu exception handleru a sweep nikdy nezastaví; upozornenie, ktorého model, cyklus alebo stav už neexistuje, sa prestane posielať. Balík sám nič neposiela: počúvajte LifecycleExpiring a upozornite po svojom.

Vrátenie expirácie

Riadky expirácie sa rollbackom vrátiť nedajú. Expiráciu vrátite prechodom vpred, napríklad reactivate — ten do stavu vstúpi znova s novým TTL.

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.