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

Konfigurácia

Balík funguje bez akejkoľvek konfigurácie — každý kľúč má predvolenú hodnotu. config/events.php publikujte, len ak chcete niečo zmeniť:

php artisan vendor:publish --tag=events-config

Každá hodnota sa číta cez prísny čítač (Support\EventsConfig): chybné trvanie, časové pásmo, názov tabuľky, šablóna URL či trieda vyhodí InvalidEventsConfigurationException (alebo InvalidConfigurationException z toolkitu) s názvom kľúča — nikdy sa potichu nepoužije náhradná hodnota.

  • Prázdna hodnota znamená predvolenú.
  • Boolean hodnoty prijímajú on/off, true/false, 1/0 a yes/no.
  • Trvania sú v ISO-8601: PT30M, PT2H, P1D.
  • Typy kľúčov a názvy tabuliek nastavte pred migráciou — určujú stĺpce.

Konfiguračný súbor

// config/events.php (imports and docblocks omitted)
return [
    'primary_key_type' => env('EVENTS_PRIMARY_KEY_TYPE', 'bigint'),
    'key_type' => env('EVENTS_KEY_TYPE', 'bigint'),

    'tables' => [
        'events' => 'events',
        'venues' => 'event_venues',
        'tiers' => 'event_admission_tiers',
        'rsvps' => 'event_rsvps',
        'hosts' => 'event_hosts',
        'invitations' => 'event_invitations',
        'reminder_deliveries' => 'event_reminder_deliveries',
    ],

    'models' => [
        'event' => Event::class,
        'venue' => Venue::class,
        'tier' => AdmissionTier::class,
        'rsvp' => Rsvp::class,
    ],

    'lifecycle' => EventLifecycle::class,

    'organizers' => ['user' => 'App\\Models\\User'],
    'attendees' => ['user' => 'App\\Models\\User'],

    'defaults' => [
        'timezone' => env('EVENTS_TIMEZONE'),
        'duration' => 'PT2H',
        'visibility' => 'public',
        'max_guests' => 0,
        'guest_list' => 'hidden',
        'show_counts' => true,
        'waitlist' => true,
    ],

    'schedule' => ['max_duration' => 'P31D'],

    'venues' => [
        'geocode_on_create' => env('EVENTS_GEOCODE_VENUES', 'off'),
        'default_timezone' => null,
    ],

    'geo' => ['max_radius_km' => 500, 'default_radius_km' => 25],

    'tags' => ['scope' => null],

    'tiers' => ['default_currency' => env('EVENTS_DEFAULT_CURRENCY')],

    'waitlist' => ['stop_promoting_before' => 'PT1H'],

    'payments' => [
        'collector' => NoPaymentCollector::class,
        'hold_for' => 'PT30M',
        'promotion_hold' => 'PT24H',
    ],

    'check_in' => [
        'opens_before' => 'PT3H',
        'closes_after' => 'PT2H',
        'url' => env('EVENTS_CHECK_IN_URL'),
    ],

    'poster' => [
        'bucket' => 'poster',
        'disk' => null,
        'max_kb' => 10240,
        'min_width' => 600,
        'min_height' => 315,
        'fallback_url' => env('EVENTS_POSTER_FALLBACK'),
        'variants' => [
            'thumb' => [400, 300],
            'card' => [800, 450],
            'square' => [1200, 1200],
            'landscape' => [1200, 900],
            'wide' => [1920, 1080],
        ],
    ],

    'urls' => [
        'resolver' => TemplateEventUrls::class,
        'event' => env('EVENTS_URL'),
        'event_link' => env('EVENTS_LINK_URL'),
        'invitation' => env('EVENTS_INVITATION_URL'),
        'rsvp' => env('EVENTS_RSVP_URL'),
    ],

    'seo' => [
        'json_ld' => [
            'type' => 'Event',
            'unlisted' => 'off',
            'expose_online_url' => 'off',
            'organizer_type' => 'Organization',
        ],
    ],

    'feeds' => [
        'keep_cancelled_for' => 'P30D',
        'max_events' => 500,
        'name' => env('APP_NAME', 'Events'),
    ],

    'resources' => [
        'organizer' => EventOrganizerResource::class,
        'host' => EventHostResource::class,
        'attendee' => EventAttendeeResource::class,
        'invitee' => EventInviteeResource::class,
        'actor' => EventActorResource::class,
        'venue_owner' => VenueOwnerResource::class,
    ],

    'routes' => [
        'enabled' => env('EVENTS_ROUTES') ?: 'off',
        'prefix' => 'api',
        'middleware' => ['api', 'throttle:events-api'],
        'auth_middleware' => ['auth'],
        'max_per_page' => 100,
        'rate_limits' => ['api' => 120, 'rsvp' => 20, 'check_in' => 300, 'feeds' => 60],
    ],

    'notifications' => [
        'enabled' => env('EVENTS_NOTIFICATIONS', 'on'),
        'channels' => ['mail'],
        'queue' => null,
        'notify_actor' => false,
        'types' => [
            'invited' => EventInvitationNotification::class,
            'confirmed' => RsvpConfirmedNotification::class,
            'waitlist_promoted' => WaitlistPromotedNotification::class,
            'reminder' => EventReminderNotification::class,
            'updated' => EventUpdatedNotification::class,
            'postponed' => EventPostponedNotification::class,
            'rescheduled' => EventRescheduledNotification::class,
            'cancelled' => EventCancelledNotification::class,
            'moved_online' => EventMovedOnlineNotification::class,
        ],
        'audiences' => [
            'reminder' => ['going'],
            'updated' => ['going', 'held'],
            'postponed' => ['going', 'held', 'waitlisted', 'interested'],
            'rescheduled' => ['going', 'held', 'waitlisted', 'interested'],
            'cancelled' => ['going', 'held', 'waitlisted', 'interested'],
            'moved_online' => ['going', 'held'],
        ],
    ],

    'reminders' => [
        'offsets' => [],
        'max_lateness' => 'PT1H',
        'all_day_at' => '09:00',
    ],

    'authorization' => [
        'register_policy' => true,
        'policy' => EventPolicy::class,
        'venue_policy' => VenuePolicy::class,
        'abilities' => [
            'create' => null,
            'admin' => 'events.admin',
            'venues' => null,
            'shared_venues' => null,
        ],
    ],

    'slugs' => [
        'history' => env('EVENTS_SLUG_HISTORY', 'off'),
        'max_length' => 120,
    ],
];

Kľúče, tabuľky a modely

KľúčEnvPredvolenéÚčel
primary_key_typeEVENTS_PRIMARY_KEY_TYPEbigintKľúč tabuľky podujatí a každého stĺpca, ktorý ukazuje na podujatie — subjekty lifecycle, označené modely v tags, vlastníci médií, história slugov. bigint, uuid alebo ulid; musí sa rovnať lifecycle.key_type a tags.key_type (a pri zapnutej histórii slugov aj sluggable.key_type). Nastavte ho pred migráciou.
key_typeEVENTS_KEY_TYPEbigintKaždý stĺpec, ktorý ukazuje na vaše modely — organizátor, účastník, spoluorganizátor, pozvaný, pozývajúci, vlastník miesta konania, added_by, checked_in_by. Musí sa rovnať typu kľúča vašich používateľov a lifecycle.actor_key_type (a pri štítkoch pre organizátora aj tags.key_type). Nastavte ho pred migráciou.
tables.events … tables.reminder_deliveries—events, event_venues, event_admission_tiers, event_rsvps, event_hosts, event_invitations, event_reminder_deliveriesNázvy siedmich tabuliek, každý ^[a-z_][a-z0-9_]{0,63}$. Premenujte ich pred migráciou — events je bežný názov tabuľky v aplikáciách.
models.event / venue / tier / rsvp—Event, Venue, AdmissionTier, RsvpPodtrieda modelu balíka; prázdna hodnota = model balíka. Čokoľvek iné vyhodí výnimku s názvom kľúča.
lifecycle—Lifecycle\EventLifecycleStavový workflow: LifecycleDefinition, ktorá implementuje Contracts\EventLifecycle — pozrite Stavy a životný cyklus.
organizers—['user' => 'App\Models\User']API alias => trieda, ktorá implementuje Organizer — zároveň triedy, ktorých sa pýta managedBy() v SQL, preto uveďte každú triedu organizátora vrátane tímov. Neexistujúca trieda sa preskočí.
attendees—['user' => 'App\Models\User']API alias => trieda účastníka; events:doctor upozorní na uvedené triedy, ktorým nemožno posielať notifikácie. Neexistujúca trieda sa preskočí.

Predvolené hodnoty nových podujatí

KľúčEnvPredvolenéÚčel
defaults.timezoneEVENTS_TIMEZONEnullPoužije sa po explicitnom časovom pásme a pásme miesta konania; prázdna hodnota = app.timezone. Neplatný názov IANA vyhodí výnimku.
defaults.duration—PT2HISO-8601, keď nie je zadaný koniec ani trvanie — ends_at nikdy nie je null.
defaults.visibility—publicpublic, unlisted alebo private.
defaults.max_guests—0Hostia v rámci jedného RSVP.
defaults.guest_list—hiddenhidden, attendees alebo public.
defaults.show_counts—trueZobrazovať divákom počty účastníkov.
defaults.waitlist—truePlné podujatie zaradí na čakaciu listinu namiesto odmietnutia.
schedule.max_duration—P31DNajdlhšie podujatie.

Miesta konania, geografia a štítky

KľúčEnvPredvolenéÚčel
venues.geocode_on_createEVENTS_GEOCODE_VENUESoffZaradí geokódovanie do frontu pre každé nové miesto konania bez súradníc.
venues.default_timezone—nullMiesto konania bez časového pásma dostane toto, inak app.timezone.
geo.max_radius_km—500Najväčší polomer hľadania v okolí (0,001–20 038).
geo.default_radius_km—25Polomer, keď nie je zadaný (≤ max_radius_km).
tags.scope—nullnull = jeden globálny katalóg štítkov; organizer = samostatný pre každého organizátora.

Typy vstupeniek, čakacia listina, platby, check-in

KľúčEnvPredvolenéÚčel
tiers.default_currencyEVENTS_DEFAULT_CURRENCYnullCena zadaná ako číslo sa číta v tejto mene; prázdna hodnota = money.default_currency.
waitlist.stop_promoting_before—PT1HTakto blízko pred začiatkom sa už automaticky neposúva.
payments.collector—Payments\NoPaymentCollectorVáš Contracts\CollectsAdmissionPayment.
payments.hold_for—PT30MAko dlho je platené miesto rezervované pre platiteľa — viac ako nula.
payments.promotion_hold—PT24HAko dlho je rezervované miesto posunuté z čakacej listiny — viac ako nula.
check_in.opens_before—PT3HSkenovanie pri vstupe sa otvára takto dlho pred začiatkom (alebo otvorením dverí).
check_in.closes_after—PT2HA zatvára sa takto dlho po skončení.
check_in.urlEVENTS_CHECK_IN_URLnullŠablóna obsahu QR kódu s {code} (http alebo https); inak samotný kód.

Plagát

KľúčEnvPredvolenéÚčel
poster.bucket—posterSkupina v media-library.
poster.disk—nullPrázdna hodnota = predvolený disk media-library.
poster.max_kb—10240Najväčší upload, najmenej 1.
poster.min_width / min_height—600 / 315Najmenšie rozmery, každý najmenej 1.
poster.fallback_urlEVENTS_POSTER_FALLBACKnullposterUrl() pre podujatie bez plagátu.
poster.variants—thumb 400×300, card 800×450, square 1200×1200, landscape 1200×900, wide 1920×1080názov => [šírka, výška], kladné celé čísla; webp, cover, vo fronte. JSON-LD používa square, landscape a wide.

URL, vyhľadávače, feedy

KľúčEnvPredvolenéÚčel
urls.resolver—Support\TemplateEventUrlsVáš Contracts\EventUrls, ak chcete volať route().
urls.eventEVENTS_URLnullŠablóna stránky podujatia: {uuid}, {slug}, {locale}.
urls.event_linkEVENTS_LINK_URLnullPodujatia len cez odkaz a súkromné, len cez uuid: {uuid}, {locale}.
urls.invitationEVENTS_INVITATION_URLnullOdkaz na prijatie: {token}, {locale}.
urls.rsvpEVENTS_RSVP_URLnullStránka vstupenky účastníka: {uuid}, {rsvp}, {locale}.
seo.json_ld.type—EventNázov typu schema.org (len písmená).
seo.json_ld.unlisted—offŠtruktúrované dáta aj pre podujatia len cez odkaz.
seo.json_ld.expose_online_url—offOdkaz na pripojenie namiesto URL stránky vo VirtualLocation.
seo.json_ld.organizer_type—OrganizationAlebo Person.
feeds.keep_cancelled_for—P30DZrušené podujatia zostávajú vo verejnom feede takto dlho.
feeds.max_events—5001–10 000.
feeds.nameAPP_NAMEEventsNázov kalendára feedu; prázdna hodnota = Events.

API resources a routy

KľúčEnvPredvolenéÚčel
resources.organizer / host / attendee / invitee / actor / venue_owner—resources {id, type}Ľubovoľná inštanciovateľná podtrieda JsonResource; dostane model — pozrite JSON API.
routes.enabledEVENTS_ROUTESoffNenastavený prepínač zostáva vypnutý — aj v publikovanom poli routes bez neho.
routes.prefix—apiPrefix URL.
routes.middleware—['api', 'throttle:events-api']Každá routa.
routes.auth_middleware—['auth']Zapisovacie routy; balík navyše odmietne zápis bez prihláseného Eloquent používateľa.
routes.max_per_page—1001–1000 (predvolená strana je 15 podujatí, 25 účastníkov alebo miest konania).
routes.rate_limits.api / rsvp / check_in / feeds—120 / 20 / 300 / 60Za minútu, každý najmenej 1.

Notifikácie a pripomienky

KľúčEnvPredvolenéÚčel
notifications.enabledEVENTS_NOTIFICATIONSonVšetky notifikácie zapnuté alebo vypnuté.
notifications.channels—['mail']Napríklad ['mail', 'database'].
notifications.queue—nullFront, do ktorého idú notifikácie.
notifications.notify_actor—falseUpozorniť aj toho, kto zmenu urobil.
notifications.types.<type>—triedy balíkaPodtrieda triedy balíka alebo false (vypnuté).
notifications.audiences.<type>—pozrite NotifikácieKto sa dozvie o zmene celého podujatia, podľa stavu RSVP.
reminders.offsets—[]Posuny pred začiatkom v ISO-8601; najviac päť, každý PT5M–P31D. Vlastný zoznam podujatia ho nahradí.
reminders.max_lateness—PT1HPripomienka oneskorená viac ako o toto sa zahodí.
reminders.all_day_at—09:00Miestny čas (HH:MM), v ktorý sa pripomínajú celodenné podujatia.

Oprávnenia a slugy

KľúčEnvPredvolenéÚčel
authorization.register_policy—trueVypnuté: zaregistrujte vlastné policies (chýbajúca trieda nikdy nezastaví štart aplikácie).
authorization.policy / venue_policy—Policies\EventPolicy / Policies\VenuePolicyNahradenie podtriedou.
authorization.abilities.create—nullGate oprávnenie, ktoré smie vytvárať podujatia; null = ktokoľvek prihlásený.
authorization.abilities.admin—events.adminSpravovať akékoľvek podujatie; nedefinované = nikto.
authorization.abilities.venues—nullGate oprávnenie, ktoré smie vytvárať miesta konania.
authorization.abilities.shared_venues—nullGate oprávnenie, ktoré vytvára a spravuje zdieľané miesta konania (bez vlastníka); null = len administrátori.
slugs.historyEVENTS_SLUG_HISTORYoffZmenený slug naďalej funguje a presmeruje (vyžaduje sluggable-migrations).
slugs.max_length—12016–255.

Prostredie

Bežné nastavenia idú cez premenné prostredia, takže konfiguráciu publikovať takmer nemusíte:

EVENTS_KEY_TYPE=uuid
EVENTS_TIMEZONE=Europe/Bratislava
EVENTS_DEFAULT_CURRENCY=EUR
EVENTS_GEOCODE_VENUES=on
EVENTS_URL=https://example.com/{locale}/events/{slug}
EVENTS_LINK_URL=https://example.com/{locale}/e/{uuid}
EVENTS_INVITATION_URL=https://example.com/invitations/{token}
EVENTS_RSVP_URL=https://example.com/events/{uuid}/tickets/{rsvp}
EVENTS_CHECK_IN_URL=https://example.com/check-in/{code}
EVENTS_ROUTES=on
EVENTS_NOTIFICATIONS=on
EVENTS_SLUG_HISTORY=off

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.