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

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 conflicts

Rollback 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:

DruhZapíše hoDá sa vrátiť
initialhook created alebo inicializácia stavu NULLnie
transitionapply() / transitionTo()áno
scheduledsweep spúšťajúci schedule()áno
expirysweep spúšťajúci expiráciunie — vráťte ju prechodom vpred, napríklad reactivate
rollbackkrok rollbackunie (bez redo)
adoptedadopcia driftunie
Lifecycles::for($listing)->history(20);        // Collection<TransitionRecord>, newest first (default 50)
Lifecycles::for($listing)->lastTransition();   // ?TransitionRecord
$listing->lifecycleHistory()->get();           // the raw LifecycleTransition models

TransitionRecord 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));   // PruneResult
php 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 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.