Notifikácie a pripomienky
Každá notifikácia rozširuje Notifications\EventNotification: ShouldQueue, odosiela sa až po commite, na fronte events.notifications.queue, cez kanály events.notifications.channels (mail a podľa potreby database), v jazyku príjemcu s časmi v časovom pásme podujatia a jeho skratkou. Žiadna nenesie názov triedy ani údaje iného účastníka.
| Typ | Trieda | Odošle sa, keď | Komu |
|---|---|---|---|
invited | EventInvitationNotification | Pozvánka sa odošle — alebo, ak bola odoslaná na koncepte, po jeho zverejnení (s novým tokenom). | Pozvaný (odkaz na prijatie; vo fronte šifrované). |
confirmed | RsvpConfirmedNotification | RSVP prejde do going. | Účastník — kód pre check-in ako text a odkaz na vstupenku, nikdy QR obrázok v e-maile. |
waitlist_promoted | WaitlistPromotedNotification | Skupina z čakacej listiny dostane miesta. | Účastník — hneď pri bezplatnom mieste; pri platenom z úlohy platby, s odkazom na platbu. |
reminder | EventReminderNotification | events:sweep, pri každom posune pripomienky. | going |
updated | EventUpdatedNotification | Zmena začiatku, konca, príznaku celodenného podujatia, časového pásma, miesta konania, odkazu na pripojenie alebo spôsobu účasti na ohlásenom podujatí. | going, held |
postponed · rescheduled · cancelled | EventPostponed… · EventRescheduled… · EventCancelledNotification | Odložené · presunuté · zrušené (vrátane rezervácií, ktoré zrušenie uvoľnilo). | going, held, waitlisted, interested |
moved_online | EventMovedOnlineNotification | Ohlásené podujatie prešlo online. | going, held |
Príjemcovia a doručenie
- Príjemcovia vychádzajú z publika podľa stavu RSVP (events.notifications.audiences.<type>), každý raz, bez toho, kto zmenu urobil (ak nie je zapnuté notify_actor), a len tí, ktorí podujatie smú vidieť a dá sa im poslať notifikácia — model bez ciest pre notifikácie sa preskočí a events:doctor ich spočíta.
- Pri doručení každá notifikácia overí znova (shouldSend()), že podujatie stále existuje a príjemca ho vidí a že ho jeho RSVP stále zaraďuje do publika — pripomienka vo fronte pre niekoho, kto minútu nato odmietol, sa zahodí.
- Zlyhaná notifikácia sa nahlási, nikdy sa nevráti do zápisu, ktorý ju spôsobil, a vrátený zápis neodošle nič. Kanál database nikdy neukladá kód pre check-in ani token pozvánky.
- E-mail má predmet s názvom podujatia, oslovenie, riadky textu a jedno tlačidlo — odkaz na prijatie pri invited (events.urls.invitation), odkaz na vstupenku pri confirmed (events.urls.rsvp), odkaz na platbu pri rezervovanom waitlist_promoted, inak stránku podujatia (events.urls.event); bez URL tlačidlo nie je. Celodenné podujatia ukazujú len dátum.
Kanál database
toArray() — to, čo ukladá database — sú čisté dáta bez názvov tried:
{
"type": "rescheduled",
"event": { "id": "uuid", "title": "Jazz Night", "starts_at": "2026-12-05T20:00:00+01:00", "timezone": "Europe/Bratislava", "all_day": false },
"previous_starts_at": "2026-11-14T19:00:00+00:00",
"reason": "The band is ill"
}| Typ | Kľúče navyše |
|---|---|
invited | message |
confirmed | rsvp {id, status, guests} |
waitlist_promoted | rsvp {id, status} |
reminder | offset |
updated | changed (názvy atribútov) |
postponed, cancelled | reason |
rescheduled | previous_starts_at, reason |
moved_online | — |
Zmena notifikácie
// config/events.php
'notifications' => [
'channels' => ['mail', 'database'],
'types' => [
'cancelled' => App\Notifications\EventCancelledWithRefund::class, // must extend the package's class
'updated' => false, // off
],
'audiences' => ['postponed' => ['going', 'held']],
],use Illuminate\Notifications\Messages\MailMessage;
use RoundlyConsulting\Events\Notifications\EventCancelledNotification;
final class EventCancelledWithRefund extends EventCancelledNotification
{
public function toMail(object $notifiable): MailMessage
{
return parent::toMail($notifiable)->line(__('Your ticket is refunded within 5 days.'));
}
}Trieda, ktorá nie je podtypom triedy balíka, vyhodí výnimku s názvom kľúča a EVENTS_NOTIFICATIONS=off vypne všetky notifikácie. Texty sú v events::notifications (en, sk) — každý typ má predmet, oslovenie a text plus spoločné riadky — so zástupnými hodnotami :title a :when. V podtriede prepíšte tieto háčiky:
| Háčik | Predvolené |
|---|---|
toMail(object $notifiable): MailMessage | Predmet, oslovenie, lines(), action(). |
toArray(object $notifiable): array | type, event, payload() |
via(object $notifiable): array | events.notifications.channels |
shouldSend(object $notifiable, string $channel): bool | Kontrola pri doručení — naďalej volajte parent::shouldSend(). |
lines() · payload() · action() (protected) | Riadky textu · extra kľúče typu · [popis, url] alebo null. |
line(string $key, array $replace = []) · when(?CarbonImmutable $moment = null) (protected) | Preložený riadok tohto typu · čas v časovom pásme podujatia a jazyku čitateľa. |
Tiché zápisy
Events::for($event)->silently()->edit()->title(['en' => 'Jazz Night (fixed typo)'])->save();
Events::for($event)->silently()->reschedule('2026-12-05 20:00');Zmeny celého podujatia cez tichý handle — update, postpone, reschedule, cancel, move online — spustia doménové udalosti s príznakom silent, no neodošlú žiadnu notifikáciu. Osobné potvrdenia — potvrdené miesto, posun z listiny, pozvánka — nie sú zmenami celého podujatia a dotknutá osoba ich dostane aj tak. Cez API robí to isté ?notify=0 pri PATCH /events/{event}.
Pripomienky
// config/events.php — every event
'reminders' => [
'offsets' => ['P1D', 'PT2H'], // at most five, each PT5M–P31D
'max_lateness' => 'PT1H',
'all_day_at' => '09:00',
],
// one event's own list replaces the config
Events::for($event)->edit()->reminders(['P2D'])->save();- Posuny sú trvania ISO-8601 pred začiatkom, medzi PT5M a P31D a najviac päť — v events.reminders.offsets pre všetky podujatia alebo vo vlastnom ->reminders([...]) podujatia. Nakonfigurovaný zoznam mimo hraníc vyhodí InvalidEventsConfigurationException s názvom kľúča a events:doctor ho ohlási.
- Denná časť posunu je kalendárna aritmetika v časovom pásme podujatia — P1D je deň predtým v rovnakom miestnom čase, pri prechode času 23 alebo 25 hodín skutočného času — a časová časť je absolútna: PT2H sú dve hodiny.
- Celodenné podujatia počítajú od events.reminders.all_day_at (09:00 miestneho času) prvého dňa: P1D je 09:00 deň predtým, PT1H 08:00 v deň podujatia.
- Práve raz: events:sweep si každú pripomienku nárokuje vložením (event, offset, starts_at) do event_reminder_deliveries, takže ju ľubovoľný počet súbežných sweepov odošle raz. Presun termínu zmení starts_at, takže pripomienky sa znova nastavia.
- Preskočí sa posun splatný pred ohlásením aktuálneho harmonogramu — žiadna pripomienka „zajtra“ pre podujatie vytvorené hodinu vopred —, posun oneskorený o viac ako events.reminders.max_lateness (PT1H), čokoľvek v čase začiatku a po ňom a podujatia, ktoré nie sú naplánované ani presunuté.
- Spustí sa RemindersDispatched(Event, string $offset, int $recipients) a SweepResult počíta reminders a notified.
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.