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

Fasáda Events

Všetko ide cez jednu fasádu, RoundlyConsulting\Events\Facades\Events — skratku nad singletonom EventsManager, bez globálneho aliasu. Miesto konania, kategória, podujatie s dvoma typmi vstupeniek, RSVP, skenovanie pri vstupe a hľadanie v okolí:

use RoundlyConsulting\Events\Facades\Events;
use RoundlyConsulting\Money\Money;

// A reusable venue: its timezone is how every wall-clock time below is read
$venue = Events::venues()->make('Blue Note')
    ->address(street: 'Hlavná 1', city: 'Bratislava', postalCode: '811 01', country: 'SK')
    ->coordinates(48.1439, 17.1097)
    ->timezone('Europe/Bratislava')
    ->create();

Events::categories()->make(['en' => 'Jazz', 'sk' => 'Jazz'])->create();   // categories are curated

$event = Events::make(['en' => 'Jazz Night', 'sk' => 'Jazzový večer'])
    ->description(['en' => 'A live quartet, then an open jam session.'])
    ->organizedBy($user)
    ->at($venue)
    ->startsAt('2026-11-14 20:00')                 // 20:00 in Bratislava, stored as UTC
    ->duration('3 hours')                          // or 'PT3H', a CarbonInterval, or ->endsAt(...)
    ->capacity(120)
    ->category('jazz')
    ->labels(['Live', 'Late night'])
    ->poster($request->file('poster'))
    ->tier('Free entry', key: 'free')
    ->tier('Supporter', price: Money::ofMajor('15', 'EUR'), capacity: 30)   // key "supporter"
    ->publish();

// RSVP: a seat while there is one, the waitlist once it is full
$rsvp = Events::for($event)->rsvp($attendee)->going(tier: 'free');
$rsvp->isGoing();                                   // or isWaitlisted(), isHeld()

// At the door: scan the attendee's QR code, as the signed-in staff member
$result = Events::for($event)->by($doorStaff)->checkIn($scannedCode);   // organizers and co-hosts only
$result->firstCheckIn;                              // false if the code was already used

// Discovery: upcoming published events (cancelled ones flagged by phase) within 25 km, nearest first
Events::browse()->upcoming()->near($here, km: 25)->orderByDistance($here)->paginate();

Metódy manažéra

MetódaVraciaČo robí
make(array|string $title)EventBuilderFluentný builder; mapa jazykov alebo reťazec v aktuálnom jazyku.
create(CreateEventData $data)EventKoncept — tá istá cesta kódu ako builder.
find(string $uuid)?EventLen živé podujatia; chybné uuid je null bez dotazu; bez pravidla viditeľnosti.
findOrFail(string $uuid)EventInak EventNotFoundException.
findBySlug(string $slug, ?Model $viewer = null)?EventPodľa reťazca jazykov; null pre podujatia len cez odkaz, súkromné podujatia a koncepty, ktoré $viewer bez odkazu vidieť nesmie.
for(Event|string $event)EventHandlePodľa modelu alebo uuid; neznáme alebo zmazané uuid vyhodí EventNotFoundException.
browse(?Model $viewer = null)Builder<Event>Viditeľné pre $viewer, verejne uvedené a ohlásené; vopred načíta venue, organizer, tiers, media a tags.
visibleTo(?Model $viewer)Builder<Event>View z policy ako dotaz — vrátane konceptov a súkromných podujatí, ktoré divák spravuje.
venues()Accessors\VenuesMiesta konania — nižšie.
categories() / labels()Tags\Handles\TypeTagsHandle z tags-for-laravel pre events:category / events:label, bez úprav.
rsvps()Accessors\RsvpsPlatby, rezervácie, kódy a QR — nižšie.
invitations()Accessors\InvitationsOdpoveď z odkazu v pozvánke — nižšie.
checkIn(string $code, Model $by, ?int $guests = null, bool $ignoreWindow = false)CheckInResultSkenovanie bez určenia podujatia — kód si podujatie nájde sám.
ics(iterable $events, ?Model $viewer = null)IcsCalendarKalendárový súbor; vynechá podujatia, ktoré $viewer vidieť nesmie.
feeds()Calendar\Feedspublic(EventFeedQuery) a for($attendee, includePrivate:).
jsonLd(Event $event)?arrayDáta schema.org alebo null.
sweep(?SweepOptions $options = null)SweepResultTo, čo spúšťa events:sweep.
repair(?RepairOptions $options = null)RepairReportTo, čo spúšťa events:repair.
Events::fake()EventsFakeLen na fasáde — nahrávací fake, ktorý volania aj tak vykoná (pozrite Testovanie).

forgetAttendee(), container() a perform() sú verejné pre vnútorné prepojenie balíka a označené ako @internal — z kódu aplikácie ich nevolajte.

Handle for($event)

Events::for($event) vráti nemenný EventHandle. by($actor) pred každým ďalším volaním overí policy podujatia, asSystem() beží ako dôveryhodný kód a silently() zapisuje bez notifikácií — každá z týchto metód vráti nový handle. Bez by() je volanie dôveryhodným PHP (úloha, seeder, príkaz) a policy sa nepýta. Mutátor vráti handle, takže volania sa dajú reťaziť; metóda, ktorá niečo vytvára alebo číta, vráti svoj výsledok. Naviazané podujatie sa aktualizuje na mieste, takže event() vráti aktuálny stav:

$handle = Events::for($event)->by($organizer);    // checks the policy before every call

$handle->tiers()->add('Crew', hidden: true, key: 'crew');
$handle->hosts()->add($partnerTeam);
$handle->publish()->event();                      // a mutator returns the handle; event() is the bound, current model

Events::for($event)->asSystem()->postpone('Storm warning');          // trusted code: no actor, no policy
Events::for($event)->silently()->reschedule('2026-12-05 20:00');     // domain events still fire, no notices
MetódaVraciaOprávnenie (s by())
by(?Model $actor)EventHandle—
asSystem()EventHandle— (bez aktéra, bez policy)
silently()EventHandle— (doménové udalosti sa spustia, notifikácie nie)
event()Event—
update(UpdateEventData $data)staticupdate
edit()EventEditorupdate, pri save()
poster(UploadedFile|string|null $file = null, ?string $draft = null)staticupdate
categorize(Tag|int|string|null $category)staticupdate
labels()EventLabels—
tiers()EventTiers—
rsvp(Model $attendee)PendingRsvp—
attendees()EventAttendees—
waitlist()EventWaitlist—
checkIn(string $code, ?int $guests = null, bool $ignoreWindow = false)CheckInResultcheckIn
hosts()EventHosts—
invitations()EventInvitations—
transferTo(Model&Organizer $organizer, bool $keepAsHost = false)statictransfer
counts()EventCountsviewCounts
publish() · unpublish() · complete()staticpublish · unpublish · complete
postpone(?string $reason = null) · cancel(?string $reason = null)staticpostpone · cancel
reschedule(CarbonInterface|string $startsAt, CarbonInterface|string|null $endsAt = null, ?string $reason = null)staticreschedule
moveOnline(string $url, bool $keepVenue = false)staticmoveOnline
transition(string $name, ?string $reason = null, array $payload = [])TransitionResulttransition
can(string $transition) · allowedTransitions()bool · list<string>false / [], keď aktér nemá transition
phase() · status()EventPhase · EventState—
delete(bool $force = false) · restore()staticdelete · restore
ics(?Model $viewer = null)IcsCalendarview
jsonLd()?array—
$handle = Events::for($event);

$handle->phase();                // EventPhase — what every package rule reads
$handle->status();               // the lifecycle state (EventStatus with the shipped lifecycle)
$handle->can('cancel');          // false when the actor lacks the transition ability
$handle->allowedTransitions();   // list<string> of transition names allowed now
$handle->counts();               // EventCounts {going, interested, waitlisted, seatsLeft}
$handle->ics($viewer);           // IcsCalendar
$handle->jsonLd();               // schema.org data, or null

manager(), actor(), isSystem(), isSilent(), authorize() a context() sú verejné pre pod-handle a označené ako @internal.

Typy vstupeniek: ->tiers()

Typ vstupenky iného podujatia sa nikdy nenájde (TierNotFoundException):

MetódaVraciaOprávnenie
make(array|string $name)TierBuildermanageTiers
create(TierData $data)AdmissionTiermanageTiers
add(array|string $name, ?Money $price = null, ?int $capacity = null, bool $hidden = false, ?string $key = null)AdmissionTiermanageTiers
update(AdmissionTier|int|string $tier, UpdateTierData $data)AdmissionTiermanageTiers
remove($tier) · restore($tier)EventTiers · AdmissionTiermanageTiers
reorder(array $order)EventTiersmanageTiers
all()Collection<AdmissionTier>— (skryté len pri manageTiers)
available()Collection<AdmissionTier>— (bez policy)

Odpoveď: ->rsvp($attendee)

Účastník, ktorý odpovedá sám za seba, potrebuje rsvp; ktokoľvek, kto odpovedá za niekoho iného, potrebuje manageAttendees:

MetódaVraciaPoznámky
by(?Model $actor)PendingRsvpPredvolene aktér handle.
going(AdmissionTier|int|string|null $tier = null, int $guests = 0, ?string $note = null)RsvpGoing, held alebo waitlisted.
interested() · notGoing()Rsvp—

Zoznam hostí: ->attendees()

Každá metóda prijme model účastníka alebo jeho Rsvp; RSVP iného podujatia sa odmietne:

MetódaVraciaOprávnenie
add(Model $attendee, $tier = null, int $guests = 0, bool $overCapacity = false)RsvpmanageAttendees
remove(Rsvp|Model $who)EventAttendeesmanageAttendees
changeTier(Rsvp|Model $who, AdmissionTier|int|string $tier)RsvpmanageAttendees
changeGuests(Rsvp|Model $who, int $guests)RsvpmanageAttendees
confirm(Rsvp|Model $who, ?string $reference = null) · release(Rsvp|Model $who)RsvpmanageAttendees
checkIn(Rsvp|Model $who, ?int $guests = null) · undoCheckIn(Rsvp|Model $who)CheckInResult · EventAttendeescheckIn
find(Model $attendee)?Rsvpvlastné RSVP aktéra, inak manageAttendees
going() · interested() · checkedIn()Collection<Rsvp>viewAttendees · viewInterested · checkIn

Čakacia listina, spoluorganizátori, pozvánky a štítky

MetódaVraciaOprávnenie
waitlist()->all() · position(Model $attendee) · promote(?int $limit = null)Collection<Rsvp> · ?int · Collection<Rsvp>viewWaitlist · viewWaitlist · manageAttendees
hosts()->add(Model&Organizer $host) · remove(Model $host)EventHostsmanageHosts
hosts()->all() · has(Model $host)Collection<EventHost> · boolview
invitations()->send(Model $invitee, ?string $message = null)EventInvitationinvite
invitations()->revoke(Model $invitee) · all() · pending()EventInvitations · Collection<EventInvitation>invite
labels()->attach($labels) · detach($labels) · sync(iterable $labels)EventLabelsupdate
labels()->all()Collection<Tag>—

Events::venues()

Nemenný: by() vráti nový prístup, ktorého zápisy overujú VenuePolicy:

MetódaVraciaPolicy (s aktérom)
by(?Model $actor)VenuesPripíše create, update, delete, restore, geocode a builder aktérovi $actor.
make(array|string $name)VenueBuilderNesie aktéra prístupu.
create(VenueData $data)Venuecreate (+ manageShared bez vlastníka, alebo vlastník musí aktéra povoliť); DTO s iným aktérom ako by() sa odmietne.
update(Venue $venue, UpdateVenueData $data)Venueupdate
delete(Venue $venue) · restore(Venue $venue)void · Venuedelete — odmietne sa (venue_in_use), kým ho používa neskončené podujatie · restore
geocode(Venue $venue, bool $force = false)Venuegeocode; len chýbajúce súradnice, ak nie je $force.
find(int $id) · ownedBy(Model $owner) · near(Coordinates $point, float $km)?Venue · Builder<Venue>Dotazy, bez policy.

Events::rsvps()

MetódaVraciaPoznámky
by(?Model $actor)Rsvpsconfirm, release a rotateCode potom overia manageAttendees; requestPayment pustí aj vlastného účastníka RSVP.
confirmPayment(string $reference)RsvpWebhook vašej platby: held → going, idempotentné; bez policy.
confirm(Rsvp $rsvp, ?string $reference = null)RsvpRezervované RSVP, ručne.
release(Rsvp $rsvp)RsvpVráti rezervované miesta hneď.
rotateCode(Rsvp $rsvp)RsvpNový kód pre check-in; starý prestane fungovať.
qr(Rsvp $rsvp, ?QrOptions $options = null)?Qr\ValueObjects\SvgKód ako inline SVG; null, ak kód nie je.
findByCode(string $code)?RsvpRSVP za kódom alebo za vstupom zo skenera, ktorý kód obsahuje.
requestPayment(Rsvp $rsvp)?PaymentRequestPožiada collector (znova) o checkout pre rezervované RSVP.

Events::invitations()

MetódaVraciaPoznámky
asSystem()InvitationsDôveryhodný kód: odpovedá za akéhokoľvek pozvaného.
accept(string $token, RsvpResponse $as = RsvpResponse::Going, ?Model $by = null)RsvpVytvorí RSVP pozvaného (going alebo interested).
decline(string $token, ?Model $by = null)EventInvitation—
find(string $token)?EventInvitationPlatná pozvánka alebo null.

Ako $by odovzdajte používateľa z požiadavky: pozvaný s účtom odpovedá len prihlásený ako on sám.

Builder podujatia

Events::make($title) vráti EventBuilder. Settery si uložia, čo dostanú, a harmonogram vyriešia až pri create(), keď je známe časové pásmo, takže ich poradie nikdy nezmení výsledný okamih; tam, kde to ide, validujú hneď:

SetterPoznámky
description(array|string $description)—
slug(array $slug)Ručné slugy pre jazyky; obsadený vyhodí invalid_event (nikdy sa nepridá prípona).
organizedBy(Model&Organizer $organizer)Povinné.
coHostedBy(Model&Organizer ...$hosts)Pridá do zoznamu.
at(Venue|int|null $venue)Model alebo jeho id.
online(?string $url)http(s), ≤ 2048 znakov; uloží sa šifrovane.
attendanceMode(AttendanceMode $mode)Musí zodpovedať miestu konania a odkazu.
timezone(string $timezone)Názov IANA.
startsAt() · endsAt() · duration()startsAt zruší celodenný rozsah, endsAt trvanie, duration koniec; duration prijme 'PT3H', '3 hours' alebo CarbonInterval.
allDay(string $from, ?string $through = null)Miestne dni Y-m-d, $through vrátane.
doorsOpenAt(CarbonInterface|string $doorsOpenAt)V rámci 12 hodín pred začiatkom.
visibility(Visibility $visibility) · unlisted() · private()—
capacity(?int $capacity) · maxGuests(int $guests)Kapacita null = bez obmedzenia.
waitlist(bool $on = true, bool $autoPromote = true)—
rsvpWindow($opensAt = null, $closesAt = null)—
guestList(GuestList $guestList) · showCounts(bool $show = true)—
poster(UploadedFile|string|null $file = null, ?string $draft = null)—
category(Tag|int|string|null $category) · labels(iterable $labels)—
tier(array|string $name, ?Money $price = null, ?int $capacity = null, bool $hidden = false, ?string $key = null)Opakovateľné.
reminders(?array $offsets)≤ 5 posunov ISO-8601, PT5M–P31D.
meta(array $meta)Súkromné: API ich nikdy nevykreslí.
by(?Model $actor)Overí create a či organizátor aktéra povoľuje.
toData() · create() · publish()CreateEventData · koncept · vytvorenie a zverejnenie v jednej transakcii.

Events::for($event)->edit() vráti EventEditor s rovnakými settermi pre existujúce podujatie a navyše title(): zmenia sa len polia, ktorých sa dotknete, save() spustí update() na handle a toData() vráti UpdateEventData. Slug, kategória, štítky, typy vstupeniek, plagát a spoluorganizátori majú vlastné metódy handle. Builder typu vstupenky a builder miesta konania opisujú ich vlastné stránky.

Traity modelov

Člen AttendsEventsPoznámky
rsvp(Event $event): PendingRsvp$user->rsvp($event)->going() — cez manažér, takže ho fake zaznamená.
isGoingTo(Event $event): bool · rsvpFor(Event $event): ?Rsvp—
eventRsvps(): MorphManyVšetky RSVP modelu.
attendingEvents() · interestingEvents(): MorphToManyPodujatia, na ktoré ide / o ktoré má záujem.
eventFeed(bool $includePrivate = false): IcsCalendarJeho osobný kalendár.
deletion hookTrvalé zmazanie (alebo zmazanie bez soft delete) uvoľní jeho RSVP: miesta sa vrátia, čakacia listina sa posunie, riadky sa odstránia.

OrganizesEvents implementuje kontrakt Organizer s predvolenými hodnotami a pridáva organizedEvents(), coHostedEvents() a organizeEvent($title) — pozrite Organizátori, spoluorganizátori a pozvánky. Oba traity idú cez manažér, takže Events::fake() zaznamená, čo robia.

PHP API dôveruje volajúcemu

Fasáda vždy vynucuje doménové pravidlá — miesta, okná, fázy, pozvánky, limity skupiny. Policy sa pýta, len keď cez by() uvediete aktéra. V kontroléri preto vždy odovzdajte prihláseného používateľa: handle bez by() skopírovaný do kontroléra pri vstupe by dovolil ktorémukoľvek prihlásenému používateľovi urobiť check-in komukoľvek.

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.