Notifikácie
Desať typov notifikácií, predvolene zapnutých (tickets.notifications.enabled) a posielaných cez tickets.notifications.channels (['mail']). Každá je notifikácia Laravelu s ShouldQueue a afterCommit: pri zmene, ktorá sa vrátila späť, sa nič nepošle a e-mail sa zostaví, až keď ho doručí fronta. Obyčajný MailMessage (bez views) plus toArray() pre kanál database; každý text pochádza z tickets::notifications v angličtine a slovenčine.
Typy a príjemcovia
| Typ | Trieda | Spúšťač | Príjemcovia |
|---|---|---|---|
created | TicketCreatedNotification | TicketCreated | Žiadateľ — potvrdenie s číslom tiketu, aj keď ho založil sám. |
assigned | TicketAssignedNotification | TicketAssigned | Tí, ktorých určí riešiteľ: Assignee::ticketNotifiables() (členovia tímu). |
replied | TicketRepliedNotification | zverejnená verejná odpoveď agenta alebo systému | Žiadateľ plus sledujúci, ktorí pre tiket nie sú agentmi. |
requester_replied | TicketRequesterRepliedNotification | zverejnená verejná odpoveď žiadateľa alebo účastníka | Notifikovateľní riešiteľa plus sledujúci agenti (platí rozsah agentov). |
note_added | TicketNoteAddedNotification | TicketNoteAdded | Notifikovateľní riešiteľa plus sledujúci agenti — len agenti. |
mentioned | TicketMentionedNotification | TicketMentioned | Spomenutá osoba, ak ju už nezasiahne notifikácia samotnej správy. |
status_changed | TicketStatusChangedNotification | TicketResolved, TicketClosed, TicketReopened | Žiadateľ plus všetci sledujúci. |
overdue | TicketOverdueNotification | TicketOverdue (kontrola termínov) | Notifikovateľní riešiteľa — pri nepriradenom tikete nikto. |
due_soon | TicketDueSoonNotification | TicketDueSoon (kontrola termínov) | Notifikovateľní riešiteľa. |
merged | TicketMergedNotification | TicketMerged | Žiadateľ zdrojového tiketu. |
- Uzavretie pri zlúčení pošle merged, nie status_changed. Automatizovaný prechod nemá aktéra, takže žiadateľ, ktorého odpoveď tiket znovu otvorila, dostane aj notifikáciu o znovuotvorení.
- Odpoveď zadržaná moderáciou hostiteľa a obsah internej poznámky sa nikdy nedostanú k neagentovi.
- Pri GuestAccessRevoked neodchádza žiadna notifikácia a pri created žiadna agentom — pre tímovú schránku počúvajte TicketCreated.
Každý zoznam príjemcov je:
- S kontrolou viditeľnosti — nikto nedostane to, čo nesmie vidieť. Interný obsah zasiahne len agentov, ktorým rozsah agentov povoľuje na tikete pracovať; všetko ostatné len toho, kto smie tiket vidieť.
- Znova skontrolovaný pri doručení: sledujúci medzitým odobratý, agent, ktorého rozsah už vylučuje, zmazaný tiket, správa presunutá z tiketu — nepošle sa nič. Notifikácia o termíne sa zahodí, keď sa termín posunul alebo bol tiket vyriešený.
- Bez duplicít — jedna notifikácia na osobu bez ohľadu na to, koľko rolí má.
- Bez toho, kto akciu vykonal, pokiaľ nie je zapnuté tickets.notifications.notify_actor (potvrdenie created odíde vždy); bez hostí, pokiaľ nie je zapnuté tickets.notifications.guests (predvolene áno); len notifikovateľní — model bez routeNotificationFor() sa preskočí.
Predmet znie [TCK-42] New reply: Printer on floor 3 is jammed (text v jazyku príjemcu), nasleduje oslovenie zobrazovaným menom príjemcu, riadky daného typu a — pri správach — text správy. To, čo ľudia napísali, sa escapuje a zobrazí ako text, nikdy sa nevykreslí ako Markdown. Hosť dostane ako tlačidlo novo vydaný podpísaný odkaz pre hosťa (žiadny, keď sa odkaz vydať nedá alebo keď uzavretie odkazy tiketu zneplatnilo); ostatní dostanú tickets.notifications.url s doplneným {reference} — prázdna hodnota znamená žiadne tlačidlo, keďže balík je headless. Dátumy sa formátujú v jazyku vykreslenia a časovom pásme aplikácie.
Payloady
toArray() — kanál database — vždy nesie type, ticket (číslo tiketu) a subject, plus:
| Typ | Pridáva |
|---|---|
assigned | assignee (zobrazované meno) |
replied, requester_replied, note_added, mentioned | comment (id), author (zobrazované meno) |
status_changed | change (resolved, closed, reopened), status (hodnota stavu) |
overdue, due_soon | due_at (ISO-8601) |
merged | target (číslo cieľového tiketu) |
Jazyk
Platia pravidlá jazyka Laravelu: notifikovateľný model s HasLocalePreference dostane svoj preferredLocale(); inak sa použije jazyk aplikácie vo workeri fronty. Ak chcete zmeniť riadok alebo pridať jazyk, publikujte tickets-translations.
Výmena triedy
Zdeďte triedu z balíka (nie sú final) a uveďte podtriedu:
use Illuminate\Notifications\Messages\MailMessage;
use RoundlyConsulting\Tickets\Notifications\TicketRepliedNotification;
final class BrandedReplyNotification extends TicketRepliedNotification
{
public function toMail(object $notifiable): MailMessage
{
return parent::toMail($notifiable)->from('[email protected]', 'Example Help Desk');
}
}// config/tickets.php
'notifications' => ['types' => ['replied' => App\Notifications\BrandedReplyNotification::class, /* … */]],Náhrada musí dediť od triedy z balíka; čokoľvek iné je chyba konfigurácie. Balík ju vytvára cez kontajner s pomenovanými argumentmi konštruktora — v prepísanom konštruktore tieto názvy parametrov zachovajte (ostatné parametre doplní kontajner):
| Typ | Argumenty |
|---|---|
| každý typ | ticket |
assigned | assignee (priradený model) |
replied, requester_replied, note_added, mentioned | comment (Comment z comments) |
status_changed | change (TicketStatusChangedNotification::RESOLVED / CLOSED / REOPENED) |
overdue, due_soon | dueAt (CarbonImmutable) |
merged | target (cieľový Ticket) |
Háčiky triedy
Každý typ dedí od abstraktnej Notifications\TicketNotification (ShouldQueue, Queueable, afterCommit(), $deleteWhenMissingModels = true, verejné $ticket). Štyri typy správ dedia od CommentNotification (verejné $comment plus author() a excerpt()); dva typy termínov od DueNotification (verejné $dueAt plus due()). shouldSend() prepisujte len so zavolaním parent::shouldSend() — drží opätovnú kontrolu viditeľnosti:
| Metóda | Viditeľnosť a použitie |
|---|---|
type(): NotificationType | public, abstract — typ, ktorý trieda posiela |
via(object $notifiable): array | public — tickets.notifications.channels |
shouldSend(object $notifiable, string $channel): bool | public — opätovná kontrola viditeľnosti pri doručení; volajte parent |
toMail(object $notifiable): MailMessage | public — predmet, oslovenie, lines(), tlačidlo z url() |
toArray(object $notifiable): array | public — type, ticket, subject plus data() |
internal(): bool | public — interný obsah, len pre agentov; true pre note_added a mentioned |
subject(): string | protected, abstract — predmet e-mailu ([TCK-42] …) |
lines(object $notifiable): array | protected, abstract — riadky e-mailu, text od používateľov už escapovaný |
data(): array | protected — čo typ pridá do toArray() |
linkedTicket(): Ticket | protected — tiket, ktorý tlačidlo otvorí (merged ukazuje na cieľ) |
url(object $notifiable): ?string | protected — odkaz pre hosťa pri TicketGuest, inak tickets.notifications.url |
guestLink(Ticket $ticket, TicketGuest $guest): ?string | protected — novo vydaný odkaz pre hosťa, alebo null, ak ho vydať nemožno |
escapedSubject(): string | protected — predmet tiketu escapovaný pre riadok e-mailu |
static line(string $key, array $replace = []): string | protected — riadok z tickets::notifications |
Príjemcovia z vlastného kódu
Notifications\RecipientResolver (získajte ho z kontajnera) odpovie, kto by sa o zmene dozvedel: created($ticket), assigned($ticket, $assignee, $actor), replied($ticket, AuthorRole $role, $actor), noteAdded($ticket, $actor), mentioned($ticket, $comment, $mentioned), statusChanged($ticket, $actor), due($ticket) a merged($source, $actor) — každý list<Model> s kontrolou viditeľnosti a bez duplicít — a replyType(AuthorRole $role). Použite ho, ak chcete tým istým ľuďom poslať správu v Slacku, push notifikáciu alebo vlastný webhook.
Ďalšie kanály
Vstavané sú len mail a database. Pre akýkoľvek iný kanál ho pridajte do notifications.channels a každý typ vymeňte za podtriedu, ktorá implementuje metódu daného kanála (toSlack(), toVonage(), …). TicketGuest smeruje kanál cez pole hosťa, ktorého route ho uvádza (email → mail, phone → vonage v dodanej sade polí).
Zlyhania
Zlyhanie notifikácie — chybné nastavenie, nedostupná fronta, e-mail, ktorý na fronte sync vyhodí výnimku — sa nahlási cez váš exception handler, nikdy sa nevyhodí: zmena, o ktorej informuje, je už potvrdená. Notifikácie pre tiket natrvalo zmazaný skôr, než sa k nim fronta dostane, sa zahodia. Typ mentioned potrebuje comments.mention_resolver.
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.