Benachrichtigungen auf allen Kanälen
Benachrichtigungen auf allen Kanälen
Die Gästebuchanwendung sammelt Feedback zu den Konferenzen。Wir sinind jedoch nicht gut darin, unseren Nutzer*innen Feedback zu geben。
德国的现代城市,德国的夜间城市,德国的夜间城市veröffentlicht城市。你könnten你的糖erneut einreichen, weil Sie denken, dass es technische问题口舌。我的意见,我的意见,wäre通行费。
auß dem sollten wir sie wahrscheinlich informieren, sobald ihr Kommentar veröffentlicht wurde。我们的电子邮件地址,也请您联系我们。
Möglichkeiten, Nutzer*innen zu benachrichtigen。E-Mail ist das Erste, woran Du vielleicht denkst。Benachrichtigungen inside halb der Webanwendung sinind in weitere Möglichkeit。Wir könnten sogar überlegen, SMS-Nachrichten zu versenden and eine Nachricht auf Slack oder Telegram zu posten。再见Möglichkeiten。
Die ob娱乐下载Symfony Notifier-Komponente implementiert viele Benachrichtigungsstrategien。
Benachrichtigungen von Webanwendungen im Browser senden
Lass uns in einem ersten Schritt die Nutzer* inen direkt im Browser, nachdem sie einen Kommentar abgegeben haben darüber informieren, dass Kommentare modernert werden:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php使用Symfony\Component\Htob娱乐下载tpFoundation\File\Exception\FileException;使用Syob娱乐下载mfony \ HttpFoundation \ \组件请求;组件使用ob娱乐下载Symfony \ \ HttpFoundation \反应;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \组件\ \通知\通知通知;+使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;类ConferenceController扩展了AbstractController的Request $ Request,会议$会议$ CommentRepository,+ NotifierInterface#[autoire ('%photo_dir%')] string $photoDir,): Response {$comment = new comment ();@@ -74,9 +77,15 @@类ConferenceController扩展AbstractController];$this->总线->调度(新的评论消息($comment->getId(), $context));+ $notifier->send(新的通知('感谢您的反馈;您的评论将在审核后发布。”,(“浏览器”)));+return $this->redirectToRoute('conference', ['slug' => $conference->getSlug()]);}+ if ($form->isSubmitted()) {+ $notifier->send(new Notification('Can you check your submission?它有一些问题。”,(“浏览器”)));+}+$offset = max(0, $request->query->getInt('offset', 0));$paginator = $commentRepository->getCommentPaginator($conference, $offset);
Der通知sendet(发送)一张Nachricht(通知)一个骰子Empfanger(收件人)über einen正构醛(通道)。
Eine Benachrichtigung hat einen Betreff(主题),einen optional Inhalt(内容)和Eine Wichtigkeit(重要性)。
我那奇怪的怪胎Benachrichtigung auf einem oder meherren Kanälen gesendet。Du kannst beispielsweise dringende Benachrichtigungen per SMS und regelmäßige Benachrichtigungen per E-Mail versenden。
Für Browser-Benachrichtigungen haben wir keine Empfänger。
Die Browser-Benachrichtigung verwendet穿衣超级丹Benachrichtigungsbereich.Wir können sie anzeigen, indem Wir das Konferenz-Template anpassen:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig@@ -3,6 +3,13 @@{% block title %}会议留言簿- {{Conference}}{% endblock %} {% block正文%}+{%消息在app.flash ('notification') %}+ + {{message}}+ + < / div >+ {% endfor %}+ {{conference}}会议
Nutzer*innen werden nun darüber informiert, dass ihr Kommentar moderiert wid:
Als zusätzlichen Bonus haben wir eine nette Benachrichtigung oben in der Website, wenn ein Formularfehler vorliegt:
提示
flashmeldungen verwenden dashttp会话system als Speichermedium。Die wichtigste Auswirkung ist, dass der HTTP-Cache deaktiviert ist, da das Session-System gestartwerden muss, um zu prüfen ob Nachrichten vorliegen。
die ist der Grund, warum wir den Code für die Flash-Meldungen in dasshow.html.twig
-Template und nicht ins base -Template eingefügt haben。Sonst hätten wir den HTTP-Cache für die首页verloren。
管理员*innen per E-Mail benachrichtigen
Anstatt über dasMailerInterface
eine E-Mail zu senden, um die管理员*innen über neue Kommentare zu informieren, wechseln wir zur notification - komponente im Message-Handler:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
——MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@命名空间App\MessageHandler;使用App \ ImageOptimizer;使用App \ \ CommentMessage消息;+使用App \ \ CommentReviewNotification通知;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;使用日志Psr \ \ LoggerInterface;桥用Symob娱乐下载fony \ \树枝\ Mime \ NotificationEmail;使用Syob娱乐下载mfony \ DependencyInjection \属性\ \组件自动装配;用Symfob娱乐下载ony \ \梅勒\ MailerInterface组件;使用Syob娱乐下载mfony \信使\ \组件属性\ AsMessageHandler;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;#[AsMessageHandler] @@ -24,8 +24,7 @@ class CommentMessageHandler private CommentRepository $ CommentRepository, private MessageBusInterface $bus, private WorkflowInterface $commentStateMachine,- private MailerInterface $mailer- #[自动连接('%admin_email%')] private string $adminEmail,+ private NotifierInterfaceLoggerInterface $logger = null, @@ -50,13 +49,7 @@类CommentMessageHandler $this->entityManager->flush();$ this - >总线- >调度($消息);} elseif ($this->commentStateMachine->can($comment, 'publish') || $this->commentStateMachine->can($comment, 'publish_ham')) {- $this->mailer->send((new NotificationEmail())- ->subject('新评论已发布')——> htmlTemplate(邮件/ comment_notification.html.twig)- - > ($ this - > adminEmail)- - > ($ this - > adminEmail)- ->context(['comment' => $comment])-);+ $this->notifier->send(new CommentReviewNotification($comment),…$this->notifier-> getadminreceivers ());} elseif ($this->commentStateMachine->can($comment, 'optimize')) {if ($comment->getPhotoFilename()) {$this->imageOptimizer->resize($this->photoDir.'/'.$comment->getPhotoFilename());
死getAdminRecipients ()
-Methode gibt die Admin-Empfänger wie in der Notifier-Konfiguration konfiguriert zurück;aktualisiere sie jetzt, um Deine eigene e - mail - address hinzuzufügen:
1 2 3 4 5 6 7 8
——/ config /包/ notifier.yaml+ + + b / config /包/ notifier.yaml@@ -13,4 +13,4 @@ framework: medium: ['email'] low: ['email'] admin_attachments:- - {email: admin@example.com}+ - {email: "%env(string:default:default_admin_email:ADMIN_EMAIL)%"}
厄斯特尔修女死了CommentReviewNotification
-Klasse:
死asEmailMessage ()
方法desEmailNotificationInterface
ist可选,aber sie erlaubt es, die E-Mail anzupassen。
在通知者的通知中,在通知者的通知中,在邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中,在通知者的邮件中。Wie Du sehen kannst, steht da niht explizit, dass die Benachrichtigung per E-Mail erfolgen soll。
Stattdessen bird der Kanal在配置/包/ notifier.yaml
Abhängig冯德Wichtigkeitder Benachrichtigung konfiguriert (Grundeinstellung ist)低
):
Wir haben über die Kanäle浏览器
和电子邮件
gesprochen。Lass unenein paar ausgefallenere anschauen。
麻省理工学院管理员innen chatten
Seien wir ehrlich, wir alle sehnen uns nach positive oder zumindest konstruktivem Feedback。温恩吉曼埃尼恩Kommentar mit Wörtern wie "toll" oder "awesome" schreibt, sollten wir diesen vielleicht schneller akzeptieren als andere。
Auf solche Kommentare möchten wir zusätzlich zur normalen E-Mail in einem即时消息系统wie Slack oder Telegram aufmerksam gemacht werden。
Installiere den Slack-Support für ob娱乐下载Symfony Notifier:
1
$ob娱乐下载Symfony作曲家要求懈怠通知
Erstelle den Slack-DSN mit einem Slack-Zugriffs-Token和dem Slack-Channel-Identifier, an den Du Nachrichten senden möchtest:松:/ / ACCESS_TOKEN@default ?通道=通道
.
Da das Zugriffs-Token eine sensible Information ist, speichere den Slack-DSN im Secret-Store:
1
$ob娱乐下载Symfony控制台的秘密:集SLACK_DSN
Gleiches gilt für das Produktivsystem:
1
$ob娱乐下载Symfony控制台的秘密:集SLACK_DSN - env =刺激
Aktiviere松弛支持在喋喋不休:
12 3 4 5 6 7 8 9 10 11 12
——/ config /包/ notifier.yaml+ + + b / config /包/ notifier.yaml@@ -1,7 +1,7 @@框架:通知:- # chatter_transports:- # slack: '%env(SLACK_DSN)%'+ chatter_transports:+ slack: '%env(SLACK_DSN)%'# texter_transsports: # twilio: '%env(TWILIO_DSN)%'
Passe die Benachrichtigungsklasse an, um Nachrichten abhängig vom Kommentartext weiterzuleiten (ein einfacher regulärer Ausdruck erledigt diese Aufgabe):
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
——/ src / / CommentReviewNotification.php通知+ + + b / src / / CommentReviewNotification.php通知@@ Symfony\Componentob娱乐下载\Notifier\Message\EmailMessage;组件使用ob娱乐下载Symfony \ \通知\ \ EmailNotificationInterface通知;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \组件\通知\接受者\ EmailRecipientInterface;+使用Syob娱乐下载mfony \组件\通知\接受者\ RecipientInterface;class CommentReviewNotification extends Notification实现EmailNotificationInterface {@@ -26,4 +27,15 @@ class CommentReviewNotification实现EmailNotificatio return $message;}++公共函数getChannels(RecipientInterface $ receiver):数组+ {+如果(preg_match (' {\ b(好棒|)\ b}我,$ this - >评论> getText ())) {+ return ['email', 'chat/slack'];+}++ $ this - >重要性(通知::IMPORTANCE_LOW);++ return ['email'];+}}
Wir haben auch die Wichtigkeit der "normalen" Kommentare geändert, da dies das Design der E-Mail leicht verändert。
和多数时候!Schreibe einen Kommentar mit“awesome”im Text und erhalte eine Nachricht über Slack。
Wie bei e - mail kannst Du einChatNotificationInterface
implementieren, um die Standard-Darstellung der Slack-Nachricht zu überschreiben:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
——/ src / / CommentReviewNotification.php通知+ + + b / src / / CommentReviewNotification.php通知@@ -3,13 +3,18 @@名称空间的应用程序\通知;使用App \实体\评论;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackDividerBlock块;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackSectionBlock块;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ SlackOptions;+使用Syob娱乐下载mfony \组件\ \ ChatMessage通知\消息;使用Syob娱乐下载mfony \组件\ \ EmailMessage通知\消息;+使用Syob娱乐下载mfony \组件\通知\ \ ChatNotificationInterface通知;组件使用ob娱乐下载Symfony \ \通知\ \ EmailNotificationInterface通知;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \组件\通知\接受者\ EmailRecipientInterface;使用Syob娱乐下载mfony \组件\通知\接受者\ RecipientInterface;-class CommentReviewNotification扩展Notification实现EmailNotificationInterface+类CommentReviewNotification扩展Notification实现EmailNotificationInterface, ChatNotificationInterface{公共函数__construct(private Comment $ Comment, @@ -28,6 +33,28 @@类CommentReviewNotification扩展Notification实现EmailNotificatio返回$message;}+公共函数asChatMessage(RecipientInterface $ receiver, string $transport = null):+ {+ if ('slack' !== $transport) {+返回null;+}++ $message = ChatMessage::fromNotification($this, $ receiver, $transport);+ $消息- >主题($ this - > getSubject ());+ $message->选项((新的SlackOptions())+ - > iconEmoji(“大作”)+ - > iconUrl(“https://guestbook.example.com”)+ - - - >用户名(“留言板”)+ ->block((new SlackSectionBlock())->text($this->getSubject())))+ ->block(new SlackDividerBlock())+ ->block((new SlackSectionBlock())+ - >文本(sprintf (' % s (% s)说:% s的,$ this - >评论> getAuthor (), $ this - >评论> getEmail (), $ this - >评论> getText ()))+)+);++返回$message;+}+公共函数getChannels(RecipientInterface $ receiver):数组{if (preg_match('{\b(great|awesome)\b}i', $this->comment->getText())) {
美好的,美好的,美好的。Wäre es niht toll, einen Kommentar direkt aus Slack akzeptieren oder ablehnen zu können?
Erweitere die Benachrichtigung, damit sie die评论- url annimmt, und füge zwei Buttons zur slackl - nachricht hinzu:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
——/ src / / CommentReviewNotification.php通知+ + + b / src / / CommentReviewNotification.php通知@@ -3,6 +3,7 @@名称空间的应用程序\通知;使用App \实体\评论;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackActionsBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackDividerBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackSectionBlock块;使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ SlackOptions;@@ -18,6 +19,7 @@类CommentReviewNotification扩展Notification实现EmailNotificatio{公共函数__construct(private Comment $ Comment,+私有字符串$reviewUrl,) {parent::__construct('新评论发布');} @@ -50,6 +52,10 @@类CommentReviewNotification扩展Notification实现EmailNotificatio ->block((新的SlackSectionBlock()) ->text(sprintf('%s (%s)说:%s', $this->comment->getAuthor(), $this->comment->getEmail(), $this->comment->getText()))) . .+ ->block((new SlackActionsBlock())+ ->按钮('接受',$this->reviewUrl, 'primary')+ ->按钮('拒绝',$this->reviewUrl.'?拒绝= 1”、“危险”)+));返回美元消息;
Es geht nun darum, Änderungen rückwärts zu verfolgen。Aktualisiere zunächst den消息处理程序,嗯die审查- url祖übergeben:
12 3 4 5 6 7 8 9 10 11 12
——MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -49,7 +49,8 @@类CommentMessageHandler $this->entityManager->flush();$ this - >总线- >调度($消息);} elseif ($this->commentStateMachine->can($comment, 'publish') || $this->commentStateMachine->can($comment, 'publish_ham')) {- $this->notifier->send(new CommentReviewNotification($comment),…+ $notification = new CommentReviewNotification($comment, $message->getReviewUrl());+ $this->notifier->send($notification,…$this->notifier-> getadmin收件人());} elseif ($this->commentStateMachine->can($comment, 'optimize')) {if ($comment->getPhotoFilename()) {$this->imageOptimizer->resize($this->photoDir.'/'.$comment->getPhotoFilename());
Wie Du sehen kannst, sollte die Review-URL Teil der Kommentar-Nachricht sein, fügen wir sie jetzt hinzu:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
——/ src /信息/ CommentMessage.php+ + + b / src /信息/ CommentMessage.php@@ -6,10 +6,16 @@类注释消息{公共函数__construct(私有int $id+私有字符串$reviewUrl,私有数组$context = [],) {}+公共函数getReviewUrl():字符串+ {+返回$this->reviewUrl;+}+公共函数getId(): int{返回$this->id;
Aktualisiere schließlich die Controller, um die Review-URL zu generieren und übergebe sie an den Constructor der Kommentar-Nachricht:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
——/ src /控制器/ AdminController.php+ + + b / src /控制器/ AdminController.php@@ Symfony\Component\Hob娱乐下载ttpKernel\ httpache \StoreInterface;使用Syob娱乐下载mfony \ \ HttpKernel \ KernelInterface组件;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;用树枝\环境;@@类AdminController extends AbstractController $this->entityManager->flush();如果($accepted) {- $this->bus->dispatch(new CommentMessage($comment->getId()));+ $reviewUrl = $this->generateUrl('review_comment', ['id' => $comment->getId()], UrlGeneratorInterface::ABSOLUTE_URL);+ $this->总线->调度(新的评论消息($comment->getId(), $reviewUrl));}返回新的响应($this->twig->渲染('admin/review.html。嫩枝”,(——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -18,6 +18,7使用Symfonob娱乐下载y\Component\Messenger\MessageBusInterface;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;class ConferenceController extends AbstractController {@@ -75,7 +76,8 @@ class ConferenceController extends AbstractController 'referrer' => $request->headers->get('referer'), 'permalink' => $request->getUri(),];- $this->bus->dispatch(new CommentMessage($comment->getId(), $context));+ $reviewUrl = $this->generateUrl('review_comment', ['id' => $comment->getId()], UrlGeneratorInterface::ABSOLUTE_URL);+ $this->总线->调度(新的评论消息($comment->getId(), $reviewUrl, $context));$notifier->send(新的通知('谢谢你的反馈;您的评论将在审核后发布。”,(“浏览器”)));
代码zu entkoppeln bedeutet Änderungen an mehren Stellen, erleichtert aber das Testen, Wiederverwenden und Durchdenken unseres代码。
Versuche es noch einmal, die Nachricht sollte jetzt in Ordnung sein:
异步线
Benachrichtigungen werden standardmäßig asynchron verschickt, genauso wie电子邮件:
Sollten wir asynchrone Nachrichten deaktivieren, würden wir ein kleines问题haben。Für jeden Kommentar erhalten wir eine E-Mail and eine slackch - nachricht。Wenn die slackl - nachricht fehlerhaft ist (falsche kanale - id, falsches Token,…),奇怪的dreimal versucht die信使- nachricht zu versenden, bevor sie verworfen wid。Da jedoch die E-Mail zuerst gesendet wd, erhalten wir drei E-Mail und keine slackl - nachrichten。
悼念逝者,悼念逝者unabhängig。短信- nachrichten sind bereits asynchron konfiguriert, falls Du auch auf Deinem teleefon benachrichtigt werden möchtest。
Nutzer*innen per E-Mail benachrichtigen
Die letzte Aufgabe besteht darin, Die Nutzer*innen zu benachrichtigen, wenenderen Kommentar geneh可能会奇怪。Wie wäre es, wenn Du das selbst umsetzt?
Weiterfuhrendes