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

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 transaction

Settery 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í
publicKaždý, keď je ohlásené.
unlistedKtokoľvek s odkazom cez uuid; findBySlug() len pre správcov, pozvaných a účastníkov. Nikdy v zoznamoch ani vo feedoch.
privateSprá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 included

Slugy 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_url

Skupina 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 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.