---
title: "Migrácia zo status enumov — Lifecycle for Laravel | Roundly"
description: "Preneste ručne písané status enumy, kontroly a príkazy na balík a presuňte existujúcu tabuľku cez lifecycle:adopt."
url: https://roundly-consulting.com/sk/open-source/navody/lifecycle-for-laravel/migracia
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Lifecycle for Laravel](https://roundly-consulting.com/sk/open-source/navody/lifecycle-for-laravel.md)

# Migrácia zo status enumov

Väčšina aplikácií začína stĺpcom status, backed enumom a niekoľkými ručne písanými kontrolami. Bežné vzory sa na balík prenesú takto — zámky riadkov, zápisy cez compare-and-swap aj obnovenie modelu v pamäti po zlyhaní sú zabudované:

| Máte | Nahraďte |
| --- | --- |
| Mapa prechodov a canTransitionTo() na enume | `transition('confirm')->from(Status::Pending)->to(Status::Confirmed)` |
| isFinal() na enume | `terminal(Status::Completed, Status::Cancelled)` |
| Akcia, ktorá prečíta stav, overí mapu a uloží | `Lifecycles::for($model)->apply('confirm')` |
| Udalosť StatusChanged odoslaná v transakcii | `LifecycleTransitioned (after commit)` |
| Mapa časov paid → paid\_at | `state(Status::Paid)->stamps('paid_at')` |
| Vedľajšie efekty v akcii (sklad, kredity) | `handledBy(SellStock::class) + CompensatesTransition` |
| Stav Scheduled a príkaz „zverejni naplánované“ | `Lifecycles::for($post)->schedule('publish', $at)` |
| Stav odvodzovaný z expires\_at pri každom čítaní | `expiresAtAttribute('expires_at')->expiresVia('expire')` |
| Príkaz „čoskoro vyprší“, ktorý upozorní pri každom behu | `ttl() + warnBefore() + renew()` |
| Počítadlá „znovu otvoriť najviac 3-krát“ | `maxOccurrences(3)` |
| Zoznamy schvaľovateľov či rolí overované len v niektorých cestách kódu | `ability('approve') / actors(User::class)` |
| Zmeny stavu z webhookov, ktoré môžu prísť dvakrát | `idempotencyKey("provider:{$eventId}")` |

## Predtým a potom

```php
// Before
public function execute(Appointment $appointment, Status $to): void
{
    if (! $appointment->status->canTransitionTo($to)) {
        throw new InvalidTransition;
    }

    $appointment->update(['status' => $to]);
    event(new AppointmentStatusChanged($appointment, $to));
}

// After
$appointment->transitionTo(Status::Confirmed);
Lifecycles::for($appointment)->by($vet)->because('Patient did not come')->apply('mark_no_show');
```

## Presun existujúcej tabuľky

- 1\. Nainštalujte balík, nastavte typy kľúčov, publikujte a spustite migrácie.
- 2\. Napíšte definíciu so stavmi, ktoré už stĺpec obsahuje — enum si ponechajte a použite ho priamo (states(Status::class)), potom ju zvalidujte voči tabuľke.
- 3\. Urobte z modelu subjekt (implements LifecycleSubject, use HasLifecycle, lifecycleDefinitions()). Nové riadky odteraz dostávajú záznamy aj históriu automaticky.
- 4\. Existujúce riadky prevezmite cez lifecycle:adopt: každý riadok dostane záznam, jeho uložený stav sa prevezme a stavy NULL sa zmenia na počiatočný stav. Prevzaté pobyty začínajú teraz; pri stavoch s TTL zabráni --no-expiry naplánovaniu expirácie pre všetky staré riadky naraz. Príkaz sa dá spustiť opakovane.
- 5\. Ručne písaný kód prechodov nahraďte apply() / transitionTo(). So zapnutým strict\_writes teraz priame $model->status = …; save() vyhodí výnimku; updaty cez query builder sa prevezmú pri ďalšej zmene.
- 6\. Vedľajšie efekty presuňte do handlerov (v transakcii) alebo listenerov LifecycleTransitioned (po commite, pre e-maily a externé volania).
- 7\. Ak ste pridali TTL alebo plány, naplánujte sweep.
- 8\. Kontroly v rozhraní nahraďte can() / allowedTransitions() alebo LifecycleResource a validáciu formulárov pravidlom ValidTransition.

```bash
php artisan lifecycle:validate "App\Models\Order:status"
php artisan lifecycle:adopt "App\Models\Order" --no-expiry   # or without --no-expiry to start TTLs now
```

V seederoch a factories je vytvorenie modelu s ľubovoľným deklarovaným stavom povolené a zaznamenané. Zmena stavu už uloženého modelu v afterCreating alebo v seederi vyžaduje Lifecycles::allowDirectWrites() (prevezme sa okamžite), prípadne spustite seeder s LIFECYCLE\_STRICT\_WRITES=false.

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/lifecycle-for-laravel.md)
