Notifikácie iných balíkov
Namapujte triedu notifikácie, ktorú posiela iný balík, na jeden z vašich druhov a budú pre ňu platiť pravidlá balíka — preferencie, povinnosť, deduplikácia, tiché hodiny aj schránka. Alebo ju úplne potlačte:
// config/notifications.php
'interop' => [
'map' => [
RoundlyConsulting\Tickets\Notifications\TicketAssignedNotification::class => 'tickets.assigned',
RoundlyConsulting\Events\Notifications\EventReminderNotification::class => 'events.reminder',
],
'suppress' => [
RoundlyConsulting\Events\Notifications\EventUpdatedNotification::class, // every channel
RoundlyConsulting\Tickets\Notifications\TicketNoteAddedNotification::class => ['mail'],
],
'database' => 'redirect', // redirect | keep | both
'hold' => true, // hold mapped mail in quiet hours
'notifiables' => [], // extra recipient classes
],Alebo za behu:
Notifications::interop()->map(TicketAssignedNotification::class, 'tickets.assigned');
Notifications::interop()->suppress(TicketNoteAddedNotification::class, ['mail']);
Notifications::interop()->mapped(); // class => type key
Notifications::interop()->suppressed();Mapovaný druh notifikáciu opisuje; subjectFrom() povie balíku, čoho sa týka:
final class TicketAssigned extends NotificationType
{
public function key(): string { return 'tickets.assigned'; }
public function category(): string { return 'tickets'; }
public function subject(): ?string { return Ticket::class; }
public function subjectFrom(Notification $notification): ?Model { return $notification->ticket; }
public function window(): ?string { return 'PT15M'; }
public function title(NotificationPayload $p): string { return __('app.ticket_assigned'); } // when the notification's data has no "title"
}Ako to funguje
- Listener NotificationSending, ktorého sa Laravel pýta pre každého príjemcu a kanál, po vlastnom shouldSend() notifikácie, v čase doručenia (pri notifikáciách vo fronte na workeri). Kanál zruší alebo ho pustí.
- Zhoda používa is_a(): podtrieda mapovanej triedy z aplikácie je tiež mapovaná; presná položka má prednosť pred predkom a vyhrá najšpecifickejší predok.
- Preferencie, deduplikáciu, podržanie a presmerovanie do schránky dostanú len príjemcovia — modely s ReceivesNotifications alebo trieda v interop.notifiables. Akýkoľvek iný príjemca (hosť, kontakt, on-demand trasa) dostane len suppress.
- Fail-open: okrem suppress sa každá výnimka v listeneri nahlási, spustí sa NotificationInteropFailed a notifikácia odíde bez zásahu. Chyba v interop nikdy nesmie zastaviť obnovu hesla.
- Deduplikácia najprv prevezme riadok: dva workery doručujúce naraz dve mapované notifikácie s rovnakým kľúčom pošlú jeden e-mail.
- Podržaná notifikácia sa uloží šifrovane a sweep ju uvoľní po novej kontrole prístupu a preferencie; zmenený alebo nedešifrovateľný payload zlyhá ako payload a nikdy sa nedeserializuje. Notifikácia, ktorú nemožno serializovať, sa nepodrží — odíde hneď.
- Mapované notifikácie nikdy nejdú do súhrnu; doctor upozorní na digestovateľný mapovaný druh. Vlastné e-maily balíka sa nikdy neupravujú.
- Notification::fake() z Laravelu nespúšťa NotificationSending, takže pod ním interop nebeží.
Rozhodovacia tabuľka (príjemca × kanál)
| Prípad | Výsledok |
|---|---|
| Trieda je potlačená (všetky kanály alebo tento) | zrušené |
| Nemapovaná; nie je príjemca alebo ide o on-demand trasu; iný kanál než mail / database | bez zásahu |
| database, redirect (predvolené) | Položka schránky cez krok zlučovania (nadpis = title z toDatabase()/toArray() notifikácie, inak nadpis druhu); riadok Laravelu sa zruší. |
| database, keep / both | Bez zásahu / položka schránky + bez zásahu. |
| mail, subjekt (subjectFrom(), čerstvý) nie je prístupný | zrušené |
| mail, druh má triedu subjektu, ale subjectFrom() vráti null | Platia preferencie a tiché hodiny; bez kontroly prístupu a deduplikácie (doctor upozorní). |
| mail, preferencia je vypnutá (nie povinný druh) | zrušené |
| mail, otvorené doručenie v okne | Zlúčené (count++), zrušené. |
| mail, práve tiché hodiny, druh nie je urgentný, interop.hold zapnuté | Podržané (šifrovaný payload), teraz zrušené, uvoľnené po tichých hodinách. |
| Inak | Prevezme sa doručenie v stave sending; Laravel odošle; NotificationSent → sent, NotificationFailed → failed(transport). |
Ochrana časovo kritických notifikácií
Čokoľvek, čo je is_a AuthenticationNotification z auth-for-laravel (OTP, magic linky, obnovy hesla), ResetPassword alebo VerifyEmail z Laravelu, smie mapovať len na druh, ktorý je urgentný, nemá okno a nepatrí do súhrnu — inak by sa druhý kód vyžiadaný v okne zlúčil s prvým a nikdy by neprišiel. Také mapovanie sa odmietne s InvalidInteropMappingException. Mapa sa overí, keď sa načítajú všetky providery (vaše druhy môžu byť v AppServiceProvider::boot()), znova lenivo pri prvom použití a v doctorovi.
Pripravená mapa pre balíky Roundly
Navrhované druhy pre notifikácie balíkov Roundly — nič sa nemapuje automaticky, zapnete to pre každú triedu. Názvy tried sú relatívne k RoundlyConsulting\<Balík>\Notifications\ a končia na Notification:
| Balík | Triedy | Navrhovaný kľúč | Priorita | subjectFrom() |
|---|---|---|---|---|
tickets | TicketCreated, TicketAssigned, TicketReplied, TicketRequesterReplied, TicketNoteAdded, TicketMentioned, TicketStatusChanged, TicketMerged | tickets.created … | normal | $n->ticket |
tickets | TicketDueSoon, TicketOverdue | tickets.due_soon, tickets.overdue | normal / urgent | $n->ticket |
events | EventInvitation, RsvpConfirmed, WaitlistPromoted, EventUpdated, EventPostponed, EventRescheduled, EventMovedOnline, EventCancelled | events.invited … | normal (cancelled: urgent) | $n->event |
events | EventReminder | events.reminder | normal | $n->event |
messages | NewMessage | messages.new | normal (okno PT10M) | $n->message->thread |
alerts | HealthCheckFailed | alerts.health_check_failed | urgent | — |
auth | any AuthenticationNotification (EmailOtp, MagicLink, ResetPassword, …) | auth.* | urgent, mandatory, bez okna | — |
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.