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

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ípadVý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 / databasebez 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 / bothBez 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 nullPlatia 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 okneZlúč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.
InakPrevezme 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íkTriedyNavrhovaný kľúčPrioritasubjectFrom()
ticketsTicketCreated, TicketAssigned, TicketReplied, TicketRequesterReplied, TicketNoteAdded, TicketMentioned, TicketStatusChanged, TicketMergedtickets.created …normal$n->ticket
ticketsTicketDueSoon, TicketOverduetickets.due_soon, tickets.overduenormal / urgent$n->ticket
eventsEventInvitation, RsvpConfirmed, WaitlistPromoted, EventUpdated, EventPostponed, EventRescheduled, EventMovedOnline, EventCancelledevents.invited …normal (cancelled: urgent)$n->event
eventsEventReminderevents.remindernormal$n->event
messagesNewMessagemessages.newnormal (okno PT10M)$n->message->thread
alertsHealthCheckFailedalerts.health_check_failedurgent—
authany 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 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.