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-configKaž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ľúč | Env | Predvolené | Účel |
|---|---|---|---|
primary_key_type | EVENTS_PRIMARY_KEY_TYPE | bigint | Kľúč 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_type | EVENTS_KEY_TYPE | bigint | Kaž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_deliveries | Ná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, Rsvp | Podtrieda modelu balíka; prázdna hodnota = model balíka. Čokoľvek iné vyhodí výnimku s názvom kľúča. |
lifecycle | — | Lifecycle\EventLifecycle | Stavový 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ľúč | Env | Predvolené | Účel |
|---|---|---|---|
defaults.timezone | EVENTS_TIMEZONE | null | Použ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 | — | PT2H | ISO-8601, keď nie je zadaný koniec ani trvanie — ends_at nikdy nie je null. |
defaults.visibility | — | public | public, unlisted alebo private. |
defaults.max_guests | — | 0 | Hostia v rámci jedného RSVP. |
defaults.guest_list | — | hidden | hidden, attendees alebo public. |
defaults.show_counts | — | true | Zobrazovať divákom počty účastníkov. |
defaults.waitlist | — | true | Plné podujatie zaradí na čakaciu listinu namiesto odmietnutia. |
schedule.max_duration | — | P31D | Najdlhšie podujatie. |
Miesta konania, geografia a štítky
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
venues.geocode_on_create | EVENTS_GEOCODE_VENUES | off | Zaradí geokódovanie do frontu pre každé nové miesto konania bez súradníc. |
venues.default_timezone | — | null | Miesto konania bez časového pásma dostane toto, inak app.timezone. |
geo.max_radius_km | — | 500 | Najväčší polomer hľadania v okolí (0,001–20 038). |
geo.default_radius_km | — | 25 | Polomer, keď nie je zadaný (≤ max_radius_km). |
tags.scope | — | null | null = jeden globálny katalóg štítkov; organizer = samostatný pre každého organizátora. |
Typy vstupeniek, čakacia listina, platby, check-in
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
tiers.default_currency | EVENTS_DEFAULT_CURRENCY | null | Cena zadaná ako číslo sa číta v tejto mene; prázdna hodnota = money.default_currency. |
waitlist.stop_promoting_before | — | PT1H | Takto blízko pred začiatkom sa už automaticky neposúva. |
payments.collector | — | Payments\NoPaymentCollector | Váš Contracts\CollectsAdmissionPayment. |
payments.hold_for | — | PT30M | Ako dlho je platené miesto rezervované pre platiteľa — viac ako nula. |
payments.promotion_hold | — | PT24H | Ako dlho je rezervované miesto posunuté z čakacej listiny — viac ako nula. |
check_in.opens_before | — | PT3H | Skenovanie pri vstupe sa otvára takto dlho pred začiatkom (alebo otvorením dverí). |
check_in.closes_after | — | PT2H | A zatvára sa takto dlho po skončení. |
check_in.url | EVENTS_CHECK_IN_URL | null | Šablóna obsahu QR kódu s {code} (http alebo https); inak samotný kód. |
Plagát
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
poster.bucket | — | poster | Skupina v media-library. |
poster.disk | — | null | Prázdna hodnota = predvolený disk media-library. |
poster.max_kb | — | 10240 | Najväčší upload, najmenej 1. |
poster.min_width / min_height | — | 600 / 315 | Najmenšie rozmery, každý najmenej 1. |
poster.fallback_url | EVENTS_POSTER_FALLBACK | null | posterUrl() pre podujatie bez plagátu. |
poster.variants | — | thumb 400×300, card 800×450, square 1200×1200, landscape 1200×900, wide 1920×1080 | ná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ľúč | Env | Predvolené | Účel |
|---|---|---|---|
urls.resolver | — | Support\TemplateEventUrls | Váš Contracts\EventUrls, ak chcete volať route(). |
urls.event | EVENTS_URL | null | Šablóna stránky podujatia: {uuid}, {slug}, {locale}. |
urls.event_link | EVENTS_LINK_URL | null | Podujatia len cez odkaz a súkromné, len cez uuid: {uuid}, {locale}. |
urls.invitation | EVENTS_INVITATION_URL | null | Odkaz na prijatie: {token}, {locale}. |
urls.rsvp | EVENTS_RSVP_URL | null | Stránka vstupenky účastníka: {uuid}, {rsvp}, {locale}. |
seo.json_ld.type | — | Event | Ná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 | — | off | Odkaz na pripojenie namiesto URL stránky vo VirtualLocation. |
seo.json_ld.organizer_type | — | Organization | Alebo Person. |
feeds.keep_cancelled_for | — | P30D | Zrušené podujatia zostávajú vo verejnom feede takto dlho. |
feeds.max_events | — | 500 | 1–10 000. |
feeds.name | APP_NAME | Events | Názov kalendára feedu; prázdna hodnota = Events. |
API resources a routy
| Kľúč | Env | Predvolené | Úč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.enabled | EVENTS_ROUTES | off | Nenastavený prepínač zostáva vypnutý — aj v publikovanom poli routes bez neho. |
routes.prefix | — | api | Prefix 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 | — | 100 | 1–1000 (predvolená strana je 15 podujatí, 25 účastníkov alebo miest konania). |
routes.rate_limits.api / rsvp / check_in / feeds | — | 120 / 20 / 300 / 60 | Za minútu, každý najmenej 1. |
Notifikácie a pripomienky
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
notifications.enabled | EVENTS_NOTIFICATIONS | on | Všetky notifikácie zapnuté alebo vypnuté. |
notifications.channels | — | ['mail'] | Napríklad ['mail', 'database']. |
notifications.queue | — | null | Front, do ktorého idú notifikácie. |
notifications.notify_actor | — | false | Upozorniť aj toho, kto zmenu urobil. |
notifications.types.<type> | — | triedy balíka | Podtrieda triedy balíka alebo false (vypnuté). |
notifications.audiences.<type> | — | pozrite Notifikácie | Kto 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 | — | PT1H | Pripomienka oneskorená viac ako o toto sa zahodí. |
reminders.all_day_at | — | 09:00 | Miestny čas (HH:MM), v ktorý sa pripomínajú celodenné podujatia. |
Oprávnenia a slugy
| Kľúč | Env | Predvolené | Účel |
|---|---|---|---|
authorization.register_policy | — | true | Vypnuté: zaregistrujte vlastné policies (chýbajúca trieda nikdy nezastaví štart aplikácie). |
authorization.policy / venue_policy | — | Policies\EventPolicy / Policies\VenuePolicy | Nahradenie podtriedou. |
authorization.abilities.create | — | null | Gate oprávnenie, ktoré smie vytvárať podujatia; null = ktokoľvek prihlásený. |
authorization.abilities.admin | — | events.admin | Spravovať akékoľvek podujatie; nedefinované = nikto. |
authorization.abilities.venues | — | null | Gate oprávnenie, ktoré smie vytvárať miesta konania. |
authorization.abilities.shared_venues | — | null | Gate oprávnenie, ktoré vytvára a spravuje zdieľané miesta konania (bez vlastníka); null = len administrátori. |
slugs.history | EVENTS_SLUG_HISTORY | off | Zmenený slug naďalej funguje a presmeruje (vyžaduje sluggable-migrations). |
slugs.max_length | — | 120 | 16–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=offPrejavte 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.