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

Stavy a životný cyklus

Stav vlastní Lifecycle for Laravel a nikdy sa nezapisuje priamo. Dodávaný Lifecycle\EventLifecycle so stavmi v Enums\EventStatus:

StavFázaČasová značkaVypršanie
draftDraft——
scheduledScheduledpublished_atcomplete pri ends_at
postponedPostponedpostponed_atnikdy — odložené podujatie sa samo neukončí
rescheduledRescheduledrescheduled_atcomplete pri ends_at
cancelledCancelled (koncový)cancelled_at—
completedCompleted (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 handleZo stavuPravidlá
publish()draftNie po ends_at.
unpublish()scheduledOdmietne sa, kým niekto ide alebo má rezervované miesta — namiesto toho odložte alebo zrušte.
postpone(?$reason)scheduled, rescheduledPonechá 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, rescheduledRezervácie vypršia, posúvanie sa zastaví, dátumy zostanú.
complete()scheduled, rescheduledNie pred starts_at; automaticky pri ends_at (lifecycle:sweep).
moveOnline($url, keepVenue: false)akýkoľvek okrem cancelled a completedNastaví 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ľvekVš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.

GuardKód zamietnutiaPri
Lifecycle\NoAttendeesno_attendeesunpublish: niekto ide alebo má rezervované miesta.
Lifecycle\RescheduledThroughEventsrescheduled_through_eventsreschedule: č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, 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():

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

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.