Stavy a životný cyklus
Stav vlastní Lifecycle for Laravel 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á
$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
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, zincKaž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():
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 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.