---
title: "Stavy a životný cyklus — Events for Laravel | Roundly"
description: "Šesť stavov nad lifecycle-for-laravel — zverejnenie, odloženie, presun, zrušenie, ukončenie a prechod online —, guardy, fázy a vlastný workflow."
url: https://roundly-consulting.com/sk/open-source/navody/events-for-laravel/stavy-podujatia
language: sk
---

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

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

# Stavy a životný cyklus

Stav vlastní [Lifecycle for Laravel](https://roundly-consulting.com/sk/open-source/navody/lifecycle-for-laravel.md) a nikdy sa nezapisuje priamo. Dodávaný Lifecycle\\EventLifecycle so stavmi v Enums\\EventStatus:

| Stav | Fáza | Časová značka | Vypršanie |
| --- | --- | --- | --- |
| `draft` | Draft | — | — |
| `scheduled` | Scheduled | `published_at` | complete pri ends\_at |
| `postponed` | Postponed | `postponed_at` | nikdy — odložené podujatie sa samo neukončí |
| `rescheduled` | Rescheduled | `rescheduled_at` | complete pri ends\_at |
| `cancelled` | Cancelled (koncový) | `cancelled_at` | — |
| `completed` | Completed (koncový) | `completed_at` | — |

## Slovesá

```php
$handle = Events::for($event)->by($organizer);

// Each verb on its own — the table below says from which state.
$handle->publish();                                      // draft → scheduled
$handle->unpublish();                                    // back to draft while nobody is going or holding seats
$handle->postpone('The band is ill');                    // dates kept, the new date still open
$handle->reschedule('2026-12-05 20:00', reason: 'New date');   // the only path to rescheduled
$handle->cancel('Venue flooded');                        // holds expire, promotion stops, dates kept
$handle->complete();                                     // not before the start; automatic at ends_at
$handle->moveOnline('https://meet.example.com/jazz', keepVenue: true);   // attendance becomes mixed
$handle->transition('approve', reason: 'Looks good');   // the generic path for your own lifecycle's steps
```

| Sloveso na handle | Zo stavu | Pravidlá |
| --- | --- | --- |
| `publish()` | `draft` | Nie po ends\_at. |
| `unpublish()` | `scheduled` | Odmietne sa, kým niekto ide alebo má rezervované miesta — namiesto toho odložte alebo zrušte. |
| `postpone(?$reason)` | `scheduled, rescheduled` | Ponechá dátumy. |
| `reschedule($start, ?$end, ?$reason)` | `scheduled, postponed, rescheduled` | Časy sa zapíšu v tej istej transakcii; previous\_starts\_at ponechá pôvodne ohlásený začiatok; čas otvorenia dverí sa zruší; rezervácie, ktoré by skončili po skoršom novom začiatku, skončia pri ňom; miesta uvoľnené medzitým idú čakacej listine. Na koncepte je to obyčajná úprava. |
| `cancel(?$reason)` | `scheduled, postponed, rescheduled` | Rezervácie vypršia, posúvanie sa zastaví, dátumy zostanú. |
| `complete()` | `scheduled, rescheduled` | Nie pred starts\_at; automaticky pri ends\_at (lifecycle:sweep). |
| `moveOnline($url, keepVenue: false)` | akýkoľvek okrem cancelled a completed | Nastaví odkaz na pripojenie; miesto konania odstráni (online) alebo ponechá (mixed); moved\_online\_at, zvýšený SEQUENCE, EventMovedOnline. Na koncepte je to obyčajná úprava. |
| `transition($name, ?$reason, $payload)` | akýkoľvek | Všeobecná cesta pre vlastné prechody životného cyklu aplikácie. |

Každý prechod povoľuje systém — volanie bez by() je dôveryhodný kód; s by($actor) najprv rozhodne policy podujatia. Každá zmena stavu zvýši SEQUENCE v kalendári a spustí EventStatusChanged a udalosť fázy (EventPublished, EventPostponed, …). Zamietnutý prechod vyhodí EventTransitionDeniedException: denials() uvádza kódy z lifecycle a pri limite požiadaviek odpovie 429 s retryAfterSeconds().

## Presun vždy posunie dátum

Dodávaný prechod reschedule nesie guard Lifecycle\\RescheduledThroughEvents (kód zamietnutia rescheduled\_through\_events): prejde len pre Events::for($event)->reschedule(), ktorý nové časy zapíše v tej istej transakcii. Každá iná cesta — Lifecycles::for($event, 'status')->asSystem()->apply('reschedule'), $event->transition('reschedule'), plán lifecycle s reschedule alebo všeobecné Events::for($event)->transition('reschedule') — sa zamietne, pretože by podujatie označila ako presunuté so starým dátumom a ohlásila by ho.

| Guard | Kód zamietnutia | Pri |
| --- | --- | --- |
| `Lifecycle\NoAttendees` | `no_attendees` | unpublish: niekto ide alebo má rezervované miesta. |
| `Lifecycle\RescheduledThroughEvents` | `rescheduled_through_events` | reschedule: čokoľvek okrem Events::for($event)->reschedule(). |

Scheduled a Rescheduled vypršia pri ends\_at cez complete — spúšťa ho sweep z lifecycle a zmena ends\_at ho znova nastaví. Odložené podujatie sa nikdy samo neukončí. Názvy prechodov sú konštanty definície: EventLifecycle::PUBLISH, UNPUBLISH, POSTPONE, RESCHEDULE, CANCEL a COMPLETE.

## Fázy

```php
use RoundlyConsulting\Events\Enums\EventPhase;

$event->phase;                              // EventPhase of the current state
$event->phase->isActive();                  // Scheduled or Rescheduled: RSVPs and check-in run
$event->phase->isTerminal();                // Cancelled or Completed
$event->phase === EventPhase::Postponed;
$event->status->color();                    // the shipped EventStatus: gray, green, amber, blue, red, zinc
```

Každý stav sa premieta na EventPhase a každé pravidlo balíka — RSVP, check-in, feedy, JSON-LD, notifikácie — číta fázy, nikdy názvy stavov. Práve preto je workflow vymeniteľný.

## Vlastný životný cyklus

Nastavte events.lifecycle na LifecycleDefinition, ktorá implementuje Contracts\\EventLifecycle — alebo rozšírte dodávaný Lifecycle\\EventLifecycle, ktorý nie je final, a upravte define():

```php
use RoundlyConsulting\Events\Contracts\EventLifecycle;
use RoundlyConsulting\Events\Enums\EventVerb;
use RoundlyConsulting\Lifecycle\Definition\LifecycleBuilder;
use RoundlyConsulting\Lifecycle\Definition\LifecycleDefinition;

final class ApprovalLifecycle extends LifecycleDefinition implements EventLifecycle
{
    public function define(LifecycleBuilder $lifecycle): void
    {
        $lifecycle->states(MyStatus::class)->initial(MyStatus::Draft);   // MyStatus implements Contracts\EventState (phase())
        // … an approve step between draft and scheduled, the rest as you need
    }

    public function transitionFor(EventVerb $verb): ?string
    {
        return match ($verb) { EventVerb::Publish => 'submit', EventVerb::Cancel => 'cancel', default => null };
    }
}

// config/events.php
'lifecycle' => App\Lifecycles\ApprovalLifecycle::class,
```

- Každý stav sa cez Contracts\\EventState premieta na EventPhase a počiatočný stav musí byť vo fáze Draft.
- Sloveso, ktoré váš životný cyklus neponúka — transitionFor() vráti null —, vyhodí UnknownEventTransitionException s odkazom na transition() ako všeobecnú cestu.
- Definícia, ktorá porušuje kontrakt, vyhodí InvalidEventLifecycleException a events:doctor ju ohlási.
- Váš krok, ktorý sa smie stať len spolu so zmenou dátumu, môže niesť ten istý guard: ->when(RescheduledThroughEvents::class).

## 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/events-for-laravel.md)
