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

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

TypTriedaSpúšťačPríjemcovia
createdTicketCreatedNotificationTicketCreatedŽiadateľ — potvrdenie s číslom tiketu, aj keď ho založil sám.
assignedTicketAssignedNotificationTicketAssignedTí, ktorých určí riešiteľ: Assignee::ticketNotifiables() (členovia tímu).
repliedTicketRepliedNotificationzverejnená verejná odpoveď agenta alebo systémuŽiadateľ plus sledujúci, ktorí pre tiket nie sú agentmi.
requester_repliedTicketRequesterRepliedNotificationzverejnená verejná odpoveď žiadateľa alebo účastníkaNotifikovateľní riešiteľa plus sledujúci agenti (platí rozsah agentov).
note_addedTicketNoteAddedNotificationTicketNoteAddedNotifikovateľní riešiteľa plus sledujúci agenti — len agenti.
mentionedTicketMentionedNotificationTicketMentionedSpomenutá osoba, ak ju už nezasiahne notifikácia samotnej správy.
status_changedTicketStatusChangedNotificationTicketResolved, TicketClosed, TicketReopenedŽiadateľ plus všetci sledujúci.
overdueTicketOverdueNotificationTicketOverdue (kontrola termínov)Notifikovateľní riešiteľa — pri nepriradenom tikete nikto.
due_soonTicketDueSoonNotificationTicketDueSoon (kontrola termínov)Notifikovateľní riešiteľa.
mergedTicketMergedNotificationTicketMergedŽ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čí.

E-mail

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:

TypPridáva
assignedassignee (zobrazované meno)
replied, requester_replied, note_added, mentionedcomment (id), author (zobrazované meno)
status_changedchange (resolved, closed, reopened), status (hodnota stavu)
overdue, due_soondue_at (ISO-8601)
mergedtarget (čí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):

TypArgumenty
každý typticket
assignedassignee (priradený model)
replied, requester_replied, note_added, mentionedcomment (Comment z comments)
status_changedchange (TicketStatusChangedNotification::RESOLVED / CLOSED / REOPENED)
overdue, due_soondueAt (CarbonImmutable)
mergedtarget (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ódaViditeľnosť a použitie
type(): NotificationTypepublic, abstract — typ, ktorý trieda posiela
via(object $notifiable): arraypublic — tickets.notifications.channels
shouldSend(object $notifiable, string $channel): boolpublic — opätovná kontrola viditeľnosti pri doručení; volajte parent
toMail(object $notifiable): MailMessagepublic — predmet, oslovenie, lines(), tlačidlo z url()
toArray(object $notifiable): arraypublic — type, ticket, subject plus data()
internal(): boolpublic — interný obsah, len pre agentov; true pre note_added a mentioned
subject(): stringprotected, abstract — predmet e-mailu ([TCK-42] …)
lines(object $notifiable): arrayprotected, abstract — riadky e-mailu, text od používateľov už escapovaný
data(): arrayprotected — čo typ pridá do toArray()
linkedTicket(): Ticketprotected — tiket, ktorý tlačidlo otvorí (merged ukazuje na cieľ)
url(object $notifiable): ?stringprotected — odkaz pre hosťa pri TicketGuest, inak tickets.notifications.url
guestLink(Ticket $ticket, TicketGuest $guest): ?stringprotected — novo vydaný odkaz pre hosťa, alebo null, ak ho vydať nemožno
escapedSubject(): stringprotected — predmet tiketu escapovaný pre riadok e-mailu
static line(string $key, array $replace = []): stringprotected — 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 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.