Vytváranie a úprava podujatí
Events::make($title) vráti EventBuilder: create() uloží koncept, publish() podujatie vytvorí a zverejní v jednej transakcii. Stačí názov, organizátor a začiatok:
use RoundlyConsulting\Events\Enums\AttendanceMode;
use RoundlyConsulting\Events\Enums\GuestList;
use RoundlyConsulting\Events\Enums\Visibility;
use RoundlyConsulting\Events\Facades\Events;
$event = Events::make(['en' => 'Jazz Night', 'sk' => 'Jazzový večer']) // EventBuilder
->description(['en' => 'A live quartet.'])
->slug(['en' => 'jazz-night']) // optional manual slugs (strict: a taken one throws)
->organizedBy($user) // Model&Organizer
->coHostedBy($partnerTeam)
->at($venue) // Venue, a venue id, or null
->online('https://meet.example.com/jazz') // stored encrypted; managers and going attendees only
->attendanceMode(AttendanceMode::Mixed) // else derived: venue → offline, link → online, both → mixed
->timezone('Europe/Bratislava')
->startsAt('2026-11-14 20:00')->duration('PT3H') // or ->endsAt(), or ->allDay($from, through: $to)
->doorsOpenAt('2026-11-14 19:00')
->visibility(Visibility::Unlisted) // or ->unlisted(), ->private()
->capacity(120)->maxGuests(2)->waitlist(true, autoPromote: true)
->rsvpWindow(opensAt: '2026-10-01 09:00', closesAt: '2026-11-14 18:00')
->guestList(GuestList::Attendees)->showCounts(true)
->category('jazz')->labels(['Live', 'Late night'])
->poster($upload) // UploadedFile, a local path, or draft: $token
->tier('Free entry', key: 'free')
->reminders(['P1D', 'PT2H'])
->meta(['source' => 'import'])
->by($user) // checks create (and organizer approval)
->create(); // a draft — or ->publish(): create + publish in one transactionSettery validujú hneď, kde to ide — časové pásmo, trvania, URL, hostia ≥ 0. Organizovanie za niekoho iného než aktéra, napríklad za tím, vyžaduje $organizer->allowsEventManagementBy($actor), inak InvalidOrganizerException. Všetky settery uvádza stránka Fasáda Events.
- Názov má najviac 255 znakov v každom jazyku (cez API 200), popis najviac 20 000 a odkaz na pripojenie najviac 2048 (http alebo https).
- Z názvov sa odstránia riadiace znaky; popisy si ponechajú zalomenia riadkov a tabulátory.
- Bez miesta konania a bez odkazu je podujatie offline s miestom, ktoré sa ešte ohlási. Inak sa spôsob účasti odvodí — miesto konania je offline, odkaz online, oboje mixed.
- Predvolené hodnoty pochádzajú z events.defaults.*: viditeľnosť, hostia na RSVP, zoznam hostí, počty, čakacia listina (so zapnutým automatickým posúvaním), trvanie a časové pásmo.
Cez DTO
use RoundlyConsulting\Events\DataTransferObjects\CreateEventData;
use RoundlyConsulting\Events\DataTransferObjects\ScheduleData;
use RoundlyConsulting\Events\DataTransferObjects\TierData;
use RoundlyConsulting\Events\Facades\Events;
$event = Events::create(new CreateEventData(
title: ['en' => 'Jazz Night'],
organizer: $user,
schedule: new ScheduleData(startsAt: '2026-11-14 20:00', duration: 'PT3H', timezone: 'Europe/Bratislava'),
capacity: 120,
tiers: [new TierData(name: 'Free entry', key: 'free')],
actor: $user,
));Z modelu organizátora
// OrganizesEvents: the builder with the organizer already set
$event = $team->organizeEvent(['en' => 'Hack night'])
->at($venue)
->startsAt('2026-12-03 18:00')
->by($user) // the team must allow $user (allowsEventManagementBy)
->publish();Úprava
use RoundlyConsulting\Events\DataTransferObjects\UpdateEventData;
use RoundlyConsulting\Events\Enums\GuestList;
Events::for($event)->by($user)->edit()
->description(null) // null clears a nullable field
->doorsOpenAt('2026-11-14 19:00')
->guestList(GuestList::Attendees)
->showCounts(false)
->save();
Events::for($event)->by($user)->edit()->title('Renamed')->capacity(150)->save();
Events::for($event)->update(new UpdateEventData(capacity: 150, description: null)); // the DTO form- Zmenia sa len zadané polia: každé pole UpdateEventData je predvolene NotGiven a null vymaže pole, ktoré môže byť prázdne. rsvpWindow() v editore zmení len zadané hranice; waitlist($on) nechá automatické posúvanie tak, ak nezadáte autoPromote:.
- Nový začiatok (alebo nový prvý deň celodenného podujatia) ohláseného podujatia sa odmietne s invalid_event — použite reschedule(). Zopakovanie súčasného začiatku, ako to robí formulár, ktorý pošle späť všetky polia, je obyčajná úprava.
- Zmena začiatku, konca, príznaku celodenného podujatia, časového pásma, miesta konania, odkazu na pripojenie alebo spôsobu účasti zvýši SEQUENCE v kalendári a pri ohlásenom podujatí upozorní účastníkov so stavom going a held — ak nepoužijete silently().
- Vyššia kapacita alebo opäť zapnuté waitlistAutoPromote posunie čakaciu listinu. EventUpdated uvádza zmenené atribúty; keď sa nič nezmenilo, nespustí sa nič.
Viditeľnosť
| Viditeľnosť | Kto ho vidí |
|---|---|
public | Každý, keď je ohlásené. |
unlisted | Ktokoľvek s odkazom cez uuid; findBySlug() len pre správcov, pozvaných a účastníkov. Nikdy v zoznamoch ani vo feedoch. |
private | Správcovia, pozvaní (čakajúci alebo s prijatou pozvánkou) a každý s aktívnym RSVP. Nikdy v zoznamoch ani vo feedoch. |
Koncepty vidia len správcovia. Celú maticu a policy nájdete na stránke Súkromie a oprávnenia.
Hľadanie a zoznamy
Events::find($uuid); // live events only; no visibility rule — authorize view yourself
Events::findOrFail($uuid); // EventNotFoundException otherwise
Events::findBySlug('jazz-night', $viewer); // along the locale chain; null for what $viewer may not see
Events::for($uuid); // a handle; an unknown or trashed uuid throws EventNotFoundException
Events::browse($viewer)->upcoming()->paginate(); // visible, listed (public), announced
Events::visibleTo($viewer)->get(); // the policy's view as a query — managed drafts includedSlugy pre jednotlivé jazyky vznikajú z názvu a po nastavení sa nemenia, takže premenované podujatie si ponechá svoje odkazy. Sú unikátne v rámci jazyka vrátane zmazaných podujatí a pri kolízii dostanú poradovú príponu — ručný slug() nikdy: obsadený vyhodí výnimku. Pri zapnutom events.slugs.history staré slugy naďalej presmerúvajú. Route-model binding používa uuid, nikdy id ani slug.
Plagát
Events::for($event)->by($organizer)->poster($request->file('poster')); // an UploadedFile or a local path
Events::for($event)->poster(draft: $token); // media-library's upload-first flow
Events::for($event)->poster(); // no file and no draft removes it
$event->poster; // ?Media
$event->posterUrl('card'); // the variant once generated, else the original, else events.poster.fallback_urlSkupina poster prijme jeden obrázok JPEG, PNG, WebP alebo AVIF do veľkosti events.poster.max_kb a s rozmermi aspoň 600×315 — z povahy verejný, s variantmi webp vo fronte (thumb, card, square, landscape, wide). posterUrl() nikdy nevyhodí výnimku: kým variant nie je hotový, vráti originál, bez plagátu events.poster.fallback_url. Spustí sa PosterChanged; trvalé zmazanie odstráni súbory plagátu a soft delete ich ponechá pre obnovenie.
Prevod, zmazanie a obnovenie
Events::for($event)->by($organizer)->transferTo($team, keepAsHost: true);
Events::for($event)->by($organizer)->delete(); // soft; refused while people are going (postpone or cancel first)
Events::for($event)->by($organizer)->restore();
Events::for($event)->delete(force: true); // the row, its RSVPs, ticket types, co-hosts, invitations, tags and poster files- transferTo() vyžaduje oprávnenie transfer — schválených používateľov organizátora alebo administrátora — a nového organizátora, ktorý aktéra povoľuje, ak aktér nie je administrátor. Pozrite Organizátori, spoluorganizátori a pozvánky.
- delete() je soft a odmietne sa (invalid_event), kým ohlásené neskončené podujatie má ľudí so stavom going alebo s rezervovanými miestami — najprv ho odložte alebo zrušte. delete(force: true) sa riadi rovnakým pravidlom a odstráni riadok, aj zmazaný, spolu s jeho RSVP, typmi vstupeniek, spoluorganizátormi, pozvánkami, štítkami a súbormi plagátu.
- Zmazané podujatie je len na čítanie: každý zápis vyhodí EventTrashedException (409), kým ho neobnovíte cez restore(). Spustia sa EventDeleted (s $force) a EventRestored.
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.