Overenie pred akciou
Zistite, či by bol prechod povolený — pre tlačidlá, menu aj nápovedy v API:
Lifecycles::for($listing)->by($user)->can('close'); // bool
Lifecycles::for($listing)->by($user)->canTransitionTo(ListingStatus::Closed);
$decision = Lifecycles::for($listing)->by($user)->check('reopen');
$decision->allowed; // false
$decision->codes(); // ['max_occurrences_reached']
$decision->messages(); // ['"Reopen" can be performed at most 3 times.']
$decision->retryAfter; // a CarbonImmutable when every denial is temporary, else null
foreach (Lifecycles::for($listing)->by($user)->allowedTransitions(includeDenied: true) as $transition) {
$transition->name; // 'close'
$transition->allowed; // true/false
$transition->denials; // list<Denial> when refused
$transition->requiresReason; // show a reason field
$transition->payloadFields; // keys of its rules()
$transition->availableAt; // when a time-based denial lifts
}
Lifecycles::for($listing)->allowedStates(); // states reachable right nowDecision, Denial a AvailableTransition
- Decision — allowed, denials a retryAfter (CarbonImmutable, ak sú všetky zamietnutia dočasné, inak null), plus denied(), has($code), find($code), first(), codes(), messages(), isRetryable() a toArray().
- Denial — code, preložená message, params, retryAfter, errors (chyby validácie payloadu podľa kľúča) a source. Kódy sú hodnoty enumu DenialCode (frozen, quota_exceeded, rate_limited, …) alebo vlastné kódy vašich guardov.
- AvailableTransition — name, label, to, toLabel, allowed, denials, requiresReason, payloadFields, availableAt (kedy pominie časové zamietnutie) a meta.
check() je len informatívne
check() spúšťa tú istú pipeline ako apply(), no apply() všetko overí znova pod zámkom riadku — medzitým môže konať niekto iný. Soft-deleted subjekt kontroly zamietnu so subject_trashed; apply() a rollback() preň vyhodia SubjectTrashedException. Pri subjekte, ktorý ešte nemá záznam stavu (alebo má drift), počíta check() minimálny čas v stave aj zapečatenie od teraz — rovnako ako adopcia v apply(). Bez dôvodu či payloadu hlásia check(), can() aj allowedTransitions() požiadavku na dôvod cez requiresReason / payloadFields, nie ako zamietnutie, takže tlačidlo prechodu, ktorý dôvod vyžaduje, sa nezobrazí ako neaktívne.
Čítanie z handlu
$handle = Lifecycles::for($listing);
$handle->state(); // the model's attribute as loaded (an enum case or a string)
$handle->effectiveState(); // the expiry target once expires_at has passed
$handle->is(ListingStatus::Active, ListingStatus::Closed);
$handle->isTerminal();
$handle->enteredAt(); // ?CarbonImmutable
$handle->version(); // 0 before the first record exists
$handle->definition(); // CompiledDefinition
$handle->isFrozen(); $handle->frozenUntil(); $handle->frozenReason();
$handle->scheduled(); // list<ScheduledTransition>
$handle->expiresAt(); $handle->isExpired(); $handle->isInGrace(); $handle->isExpiringWithin('3 days');
$handle->history(); $handle->lastTransition();state() je atribút modelu tak, ako je načítaný — bez opätovného čítania z databázy (na to model znova načítajte) a bez vplyvu oneskorenej expirácie; effectiveState() je stav, aký bude po spustení oneskorenej expirácie, ešte predtým, než prebehne sweep.
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.