Fasáda Lifecycles
Všetko ide cez jednu fasádu, RoundlyConsulting\Lifecycle\Facades\Lifecycles (zaregistrovanú aj ako globálny alias Lifecycles). for($model) vráti handle na jeden cyklus jedného subjektu, model() pracuje s triedou modelu, definitions() a schedules() združujú operácie s definíciami a plánmi a niekoľko plochých slovies spúšťa úlohy pre celý balík:
use RoundlyConsulting\Lifecycle\Facades\Lifecycles;
// A handle per subject (and lifecycle), carrying the call's context
Lifecycles::for($listing)->by($user)->because('Back in stock')->apply('reopen');
Lifecycles::for($order, 'payment_status')->apply('authorize');
// Ask before acting
Lifecycles::for($listing)->by($user)->can('close');
// Time: schedules, expiry and freezes
Lifecycles::for($listing)->by($editor)->schedule('publish', $publishAt);
Lifecycles::for($listing)->renew();
Lifecycles::for($listing)->by($moderator)->because('Under review')->freeze(until: now()->addDays(3));
// Undo
Lifecycles::for($listing)->by($user)->rollback();
// Model-level helpers, definitions, schedules and the sweep
Lifecycles::model(Listing::class)->graph();
Lifecycles::definitions()->validate(ListingLifecycle::class);
Lifecycles::schedules()->due();
Lifecycles::sweep();
// Deliberate direct writes, adopted at once
Lifecycles::allowDirectWrites(fn () => $listing->update(['status' => ListingStatus::Closed]));Ploché metódy
| Metóda | Vracia | Čo robí |
|---|---|---|
for($model, ?$lifecycle) | LifecycleHandle | Handle na jeden cyklus subjektu (prvý deklarovaný, ak žiadny neuvediete). |
model(Model::class, ?$lifecycle) | ModelLifecycle | Pomocníci na úrovni triedy: stavy, počiatočný a koncové stavy, prechody, graf, hromadná adopcia. |
definitions() | DefinitionsAccessor | Skompilované definície, validácia, grafy a nakonfigurované subjekty. |
schedules() | SchedulesAccessor | Spustí splatné plány, pošle upozornenia, vypíše splatné plány, zopakuje zlyhaný plán. |
sweep(?$limit, ?$queue, ?$connection) | SweepResult | Upozornenia, potom všetky splatné expirácie a plány — to isté ako lifecycle:sweep. Null pre queue sa riadi schedules.queue.enabled; null pre connection spracuje predvolené databázové pripojenie. |
prune(PruneOptions) | PruneResult | Zmaže staré riadky histórie a dokončené plány. |
adopt($model, ?$lifecycle) / adoptAll(Model::class, ?$lifecycle, $chunk, $scheduleExpiry) | bool / int | Zosúladí jeden subjekt alebo všetky riadky modelu s uloženým stavom. |
allowDirectWrites(fn () => …) | mixed | Spustí kód, ktorý zapisuje atribúty cyklu priamo; zmena sa pri uložení prevezme. |
fake() | LifecycleFake | Vymení manažéra za nahrávací fake (pozri Testovanie). |
apply(TransitionRequest), check(), rollback(RollbackRequest), … | — | Vrstva s request DTO — pozri DI a akcie. |
Handle for($model)
Lifecycles::for($model, ?$lifecycle) vráti nemenný LifecycleHandle; null vyberie prvý cyklus z lifecycleDefinitions(). Každá kontextová metóda vráti nový handle, takže handle môžete bezpečne zdieľať. Model, ktorý nie je LifecycleSubject, vyhodí UnknownLifecycleException a rovnako aj nedeklarovaný cyklus.
| Metóda | Vracia | Čo robí |
|---|---|---|
by(?$actor), asSystem(), because(?$reason), with(array $payload), expectingVersion(int), idempotencyKey(string) | LifecycleHandle | Kontext pre ďalšie volania — každá vráti nový handle; platí posledné z by() / asSystem(). |
apply($transition) / transitionTo($state) | TransitionResult | Aplikuje podľa názvu alebo jediný prechod do cieľového stavu. Vyhodí TransitionDeniedException. |
attempt($transition) | TransitionAttempt | Ako apply(), no zamietnutie vráti namiesto vyhodenia. |
can($transition) / canTransitionTo($state) | bool | Bolo by to teraz povolené? |
check($transition) / checkTransitionTo($state) | Decision | Úplné, informatívne rozhodnutie so všetkými zamietnutiami. |
allowedTransitions(includeDenied: false) / allowedStates() | list | Objekty AvailableTransition (s includeDenied aj zamietnuté) alebo dosiahnuteľné stavy. |
state() / effectiveState() / is(...$states) / isTerminal() | state / bool | Atribút modelu tak, ako je načítaný (bez opätovného čítania z databázy), stav po spustení oneskorenej expirácie, príslušnosť, koncovosť. |
enteredAt() / version() / definition() | ?CarbonImmutable / int / CompiledDefinition | Čas vstupu do aktuálneho stavu, verzia záznamu, skompilovaná definícia. |
history($limit = 50) / lastTransition() | Collection / ?TransitionRecord | Riadky histórie, najnovšie prvé. |
rollback(force: false) / rollbackTo($record, force: false) | RollbackResult | Vráti posledný prechod alebo všetko po riadku histórie — všetko alebo nič. |
canRollback() / canRollbackTo($record) | Decision | Bol by rollback teraz povolený? |
freeze(until: null) / unfreeze() / isFrozen() / frozenUntil() / frozenReason() | bool / … | Zmrazí tento cyklus (zaznamená sa dôvod a aktér handlu) a prečíta zmrazenie. |
schedule($transition, $at) / cancelScheduled($transition) / scheduled() | ScheduledTransition / bool / list | Spustí prechod neskôr, zruší ho, vypíše otvorené plány. |
retryScheduled($transition) | bool | Vráti najnovší zlyhaný plán prechodu tohto subjektu späť medzi čakajúce (expiráciu podľa jej expiračného prechodu), na pripojení subjektu. |
expiresAt() / isExpired() / isInGrace() / isExpiringWithin($interval) | ?CarbonImmutable / bool | Čítanie čakajúcej expirácie. |
expireAt($at) / extend($by) / renew(?$for) / neverExpire() | CarbonImmutable / bool | Zmena expirácie aktuálneho pobytu v stave. |
adopt() | bool | Zosúladí tento subjekt s uloženým stavom hneď. |
Lifecycles::model()
Pomocníci na úrovni triedy pre jeden cyklus modelu:
| Metóda | Vracia | Čo robí |
|---|---|---|
definition() | CompiledDefinition | Skompilovaná definícia. |
states() / initial() / terminal() | list / state / list | Deklarované, počiatočný a koncové stavy. |
transitions() | list<TransitionDefinition> | Všetky prechody v poradí deklarácie. |
graph(?GraphFormat) | string | Diagram v Mermaid alebo DOT. |
adopt(chunk: 500, scheduleExpiry: true) | int | Zosúladí všetky riadky modelu; vráti počet zmenených (= lifecycle:adopt). |
Lifecycles::definitions()
| Metóda | Vracia | Čo robí |
|---|---|---|
get($definitionClass) | CompiledDefinition | Skompiluje (raz za proces) a vráti definíciu. |
of($model, ?$lifecycle) | CompiledDefinition | Definícia za cyklom modelu. |
validate($definitionClass) | ValidationReport | isValid(), errors(), warnings() — bez vyhodenia výnimky. |
graph($definitionClass, ?GraphFormat) | string | Diagram v Mermaid alebo DOT. |
subjects() / registered() | list | config('lifecycle.subjects') a definície za nimi. |
flush() | void | Zahodí skompilované definície (testy, ktoré cyklus predefinujú). |
Lifecycles::schedules()
| Metóda | Vracia | Čo robí |
|---|---|---|
runDue(?$limit, ?$queue, ?$connection) | SweepResult | Spustí splatné plány, bez upozornení. |
warn(?$limit, ?$connection) | int | Pošle splatné upozornenia na expiráciu; vráti ich počet. |
retry($scheduleId, ?$connection) | bool | Zlyhaný → čakajúci, pokusy sa vynulujú. Id plánov platia v rámci databázového pripojenia. |
due(?$now, $limit = 100, ?$connection) | Collection<ScheduledTransition> | Čakajúce plány splatné do teraz, najstaršie prvé. Len na čítanie. |
failed($limit = 100, ?$connection) | Collection<ScheduledTransition> | Zlyhané plány, naposledy zlyhané prvé — s ich subjektom a výsledkom. |
Skratky traitu HasLifecycle ($listing->transition(), $listing->lifecycle()->…) volajú toho istého manažéra, takže všetko uvedené — vrátane Lifecycles::fake() — platí aj pre ne.
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.