Rollbacky a história
Lifecycles::for($listing)->by($user)->rollback(); // undo the last transition
Lifecycles::for($listing)->rollbackTo($record); // undo everything after a history row (or its id)
Lifecycles::for($listing)->canRollback(); // Decision
Lifecycles::for($listing)->canRollbackTo($record); // Decision
Lifecycles::for($listing)->rollback(force: true); // ignore snapshot conflictsRollback vracia riadky efektívnej histórie od najnovšieho. Platí všetko alebo nič: jeden zamietnutý riadok zamietne celé volanie (RollbackDeniedException). Riadok sa dá vrátiť, ak platí všetko z tohto:
- Ide o riadok transition alebo scheduled (expiráciu vrátite prechodom vpred, napríklad reactivate).
- Jeho prechod stále existuje a nie je irreversible().
- Jeho handler je null, implementuje CompensatesTransition alebo je označený reversible(withoutCompensation: true).
- Jeho okno ešte neuplynulo (reversible(within:), inak rollback.default_window).
- Subjekt je stále v stave, ktorý tento riadok vytvoril.
- Nie je zmrazený (pokiaľ každý vracaný prechod nemá ignoresFreeze()) ani zapečatený.
- Aktér prejde rollbackRequires() / rollbackGuard() — alebo pravidlami pre aktéra samotného prechodu (prechod so systemOnly() vyžaduje systémový kontext), takže nikto nevráti to, čo by sám nemohol urobiť.
- Dôvod sa zmestí do history.reason_max_length.
- Žiadny atribút v snapshote sa odvtedy nezmenil (pokiaľ nepoužijete force).
- Kvóta obnoveného stavu to dovolí, počítaná v skupine, ktorú rollback obnoví.
- Subjekt nie je soft-deleted: canRollback() odpovie subject_trashed a rollback() vyhodí SubjectTrashedException.
Rollback obnoví stav, čas vstupu doň, počítadlá, atribúty zo snapshotu a stĺpce stampov. Zruší plány, ktoré riadok vytvoril, a znova otvorí tie, ktoré zrušil. Pridá riadky rollback; samotný rollback sa vrátiť nedá a rovnako ani riadky initial či adopted. Hooky stavu sa nespúšťajú a pokusy rate limitu sa nevracajú. Po commite sa odošle LifecycleTransitioned (druh rollback) za každý riadok rollbacku a LifecycleRolledBack raz za volanie. Jedno rollbackTo() vráti najviac rollback.max_steps riadkov.
História
Do histórie sa len pridáva: úprava alebo zmazanie riadku cez Eloquent vyhodí HistoryIsAppendOnlyException a riadky odstráni len lifecycle:prune (alebo vyčistenie pri trvalom zmazaní). Každý riadok zaznamená aktéra, dôvod, zvalidovaný kontext (bez citlivých kľúčov), snapshot, verziu a čas:
| Druh | Zapíše ho | Dá sa vrátiť |
|---|---|---|
initial | hook created alebo inicializácia stavu NULL | nie |
transition | apply() / transitionTo() | áno |
scheduled | sweep spúšťajúci schedule() | áno |
expiry | sweep spúšťajúci expiráciu | nie — vráťte ju prechodom vpred, napríklad reactivate |
rollback | krok rollbacku | nie (bez redo) |
adopted | adopcia driftu | nie |
Lifecycles::for($listing)->history(20); // Collection<TransitionRecord>, newest first (default 50)
Lifecycles::for($listing)->lastTransition(); // ?TransitionRecord
$listing->lifecycleHistory()->get(); // the raw LifecycleTransition modelsTransitionRecord vystavuje id, lifecycle, kind (TransitionKind), transition, from, to, actorType, actorId, system, reason, context, snapshot, version, revertsId, scheduleId, occurredAt a reverted.
Čistenie
use RoundlyConsulting\Lifecycle\DataTransferObjects\PruneOptions;
Lifecycles::prune(new PruneOptions(historyOlderThanDays: 365, schedulesOlderThanDays: 30)); // PruneResultphp artisan lifecycle:prune # defaults from config
php artisan lifecycle:prune --history-days=365 --schedule-days=30 --dry-run
php artisan lifecycle:prune --database=tenant # another connection's package tablesČistenie nikdy nevynuluje limity ani cooldowny — tie sú v zázname stavu — no zahodí body rollbacku a idempotentné kľúče staršie ako hranica. Značku, ktorú zanechá volanie neverExpire(), ponechá, kým daný pobyt trvá. --database vyčistí tabuľky balíka na inom pripojení.
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.