通知的
通知的
留言本应用的收集反馈会议。但我们不擅长给我们的用户反馈。
评论是主持,他们可能不明白为什么没有立即发表评论。他们甚至可能补交思维有一些技术问题。给他们反馈的评论后,就好了。
同时,我们应该平当他们已经发表置评。我们要求他们的电子邮件,所以我们最好使用它。
有很多方法来通知用户。电子邮件是第一个媒介,你可能会思考,但是在web应用程序是另一个通知。我们甚至可以考虑发送SMS消息,发布一条消息在松弛或电报。有很多的选择。
Symfob娱乐下载ony通知组件实现了许多通知策略。
在浏览器中发送Web应用程序通知
作为第一步,让我们通知用户评论在浏览器中直接主持后提交:
1 2 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 30 31 32 33 34 35
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -14 6 + 14 8 @@使用Syob娱乐下载mfony \ HttpFoundation \ \组件文件\ \ FileException异常;使用Syob娱乐下载mfony \ HttpFoundation \ \组件请求;组件使用ob娱乐下载Symfony \ \ HttpFoundation \反应;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \组件\ \通知\通知通知;+使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;用树枝\环境;@@ -53 55 7 + 7 @@类ConferenceController延伸AbstractController} #(路线(“/会议/{蛞蝓}”,名字:“会议”))公共函数显示(请求美元请求、会议会议上,美元CommentRepository CommentRepository美元,字符串photoDir美元):反应+公共函数显示(请求美元请求、会议会议上,美元CommentRepository CommentRepository美元,美元NotifierInterface通知,字符串photoDir美元):反应{$评论=新的评论();$ = $ this - > createForm形式(CommentFormType::类,评论美元);@@ -82、9 + 84,15 @@类ConferenceController延伸AbstractController $ this - >总线- >调度(新CommentMessage (- > getId()发表评论,美元上下文));+ $通知- >发送(新通知('谢谢你的反馈;你的评论将被审核后发布。”,(“浏览器”)));+返回$ this - > redirectToRoute(“会议”,(“鼻涕虫”= > $会议- > getSlug ()));}+如果($形式- > isSubmitted ()) {+ $通知- >发送(新通知(“你能检查你的提交吗?有一些问题。”,(“浏览器”)));+}+抵消美元= max(0, $请求- >查询- > getInt(“抵消”,0));$ paginator = $ commentRepository - > getCommentPaginator(会议,抵消美元);
的通知发送一个通知来收件人通过一个通道。
通知有一个主题,一个可选的内容和重要性。
在一个或多个频道发送通知根据其重要性。你可以通过短信发送紧急通知和定期的通过电子邮件。
对于浏览器的通知,我们没有接受。
浏览器使用通知flash的消息通过通知部分。我们需要显示他们通过更新会议模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- - - /模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig13 @@ @@ 3 6 + 3{%块标题%}会议留言板,{{会议}}{% endblock %}{%块体%}在app.flashes +{%为消息(“通知”)%}+ < div class = "警报alert-info alert-dismissible褪色秀”>+{{消息}}+ <按钮类型=“按钮”class =“btn-close data-bs-dismiss =“警报”aria-label = "关闭" > < span aria-hidden = " true " >报;< / span > < /按钮>+ < / div >+ {% endfor %}+< h2类= " mb-5 " > < / h2 >{{会议}}会议
现在将通知用户,他们提交主持:
还有一个额外的好处,我们有一个好的通知顶部的网站如果有一种错误:
提示
使用Flash消息HTTP会话系统存储介质。主要后果是禁用HTTP缓存作为会话系统必须开始检查信息。
这就是为什么我们已经添加了flash的信息片段show.html.twig
模板,而不像我们在基地一个失去了HTTP缓存的主页。
通过电子邮件通知管理员
而不是通过发送一封电子邮件MailerInterface
通知管理评论刚刚发布,切换到使用通知组件的消息处理程序:
1 2 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ 4、14 + 4、14 @@名称空间应用\ MessageHandler;使用App \ ImageOptimizer;使用App \ \ CommentMessage消息;+使用App \ \ CommentReviewNotification通知;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;使用日志Psr \ \ LoggerInterface;桥用Symob娱乐下载fony \ \树枝\ Mime \ NotificationEmail;用Symfob娱乐下载ony \ \梅勒\ MailerInterface组件;使用Syob娱乐下载mfony \信使\ \组件处理程序\ MessageHandlerInterface;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;类CommentMessageHandler实现MessageHandlerInterface @@ -21, 22 + 21日20 @@类CommentMessageHandler实现MessageHandlerInterface私人commentRepository美元;私人美元总线;私人美元工作流;——私人美元梅勒;+私人美元通知;私人imageOptimizer美元;——私人adminEmail美元;私人photoDir美元;私人美元记录器;公共函数__construct (EntityManagerInterface entityManager美元,SpamChecker SpamChecker美元,CommentRepository CommentRepository美元,美元MessageBusInterface巴士,WorkflowInterface commentStateMachine美元,美元MailerInterface梅勒,ImageOptimizer ImageOptimizer美元,字符串adminEmail美元,字符串photoDir美元,美元LoggerInterface记录器= null)+公共职能__construct (EntityManagerInterface entityManager美元,SpamChecker SpamChecker美元,CommentRepository CommentRepository美元,美元MessageBusInterface巴士,WorkflowInterface commentStateMachine美元,美元NotifierInterface通知,ImageOptimizer ImageOptimizer美元,字符串photoDir美元,美元LoggerInterface记录器= null){$ this - > entityManager = $ entityManager;$ this - > spamChecker = $ spamChecker;$ this - > commentRepository = $ commentRepository;$ this - >总线= $总线;= $ $ this - >工作流commentStateMachine;- $ this - >梅勒= $梅勒;+ $ this - >通知= $通知;$ this - > imageOptimizer = $ imageOptimizer;- $ this - > adminEmail = $ adminEmail;$ this - > photoDir = $ photoDir;$ this - >日志记录器= $记录器;}@@ -62 13 + 60 7 @@类CommentMessageHandler实现MessageHandlerInterface $ this - >总线- >调度($消息);}elseif ($ this - >工作流- >(评论,美元“发布”)| | $ this - >工作流- >(评论美元,publish_ham)) {- $ this - >梅勒- >发送((新NotificationEmail ())- - - - - - - >主题(“新评论”)- - > htmlTemplate(邮件/ comment_notification.html.twig)- - > ($ this - > adminEmail)- - > ($ this - > adminEmail)- - - - - - - >上下文([“评论”= >评论美元])-);+ $ this - >通知- >发送(新CommentReviewNotification(评论美元),…$ this - >通知- > getAdminRecipients ());}elseif ($ this - >工作流- >(评论美元,“优化”)){如果($评论- > getPhotoFilename ()) {$ this - > imageOptimizer - >调整($ this - > photoDir‘/’。$评论- > getPhotoFilename ());
的getAdminRecipients ()
方法返回通知配置中配置管理接受者;现在更新添加您自己的电子邮件地址:
1 2 3 4 5 6 7 8
- - - / config /包/ notifier.yaml+ + + b / config /包/ notifier.yaml@@ -13 4 + 13 4 @@框架:媒介:['邮件']低:['邮件']admin_recipients:——{电子邮件:admin@example.com}+ -{电子邮件:“% env (string:默认值:default_admin_email: ADMIN_EMAIL) %”}
现在,创建CommentReviewNotification
类:
的asEmailMessage ()
方法从EmailNotificationInterface
是可选的,但是它允许自定义电子邮件。
的一个好处直接使用通知而不是梅勒是它将发送邮件通知使用的“通道”。正如你所看到的,没有明确说,通知应发送的电子邮件。
相反,通道配置配置/包/ notifier.yaml
根据重要性的通知(低
默认情况下):
我们已经谈过了浏览器
和电子邮件
频道。让我们看看一些更漂亮的。
与管理员聊天
老实说,我们都等积极的反馈。或者至少有建设性的反馈。如果某人的帖子评论说“伟大的”或“awesome”一词,我们可能要接受他们比其他人快。
对于这样的消息,我们想要在一个即时消息提醒系统松弛或电报除了常规的电子邮件。
安装松弛支持Symfony通知:ob娱乐下载
1
美元ob娱乐下载symfony作曲家点播slack-notifier
开始,组合松弛DSN松弛访问令牌和松弛通道标识符,你想发送消息:松:/ / ACCESS_TOKEN@default ?通道=通道
。
作为访问令牌是敏感的,商店的松弛DSN秘密商店:
1
美元ob娱乐下载symfony控制台的秘密:集SLACK_DSN
做同样的生产:
1
美元ob娱乐下载symfony控制台的秘密:集SLACK_DSN - env =刺激
使喋喋不休松弛支持:
1 2 3 4 5 6 7 8 9 10 11 12
- - - / config /包/ notifier.yaml+ + + b / config /包/ notifier.yaml7 + 1,7 @@ @@ 1日框架:通知:- # chatter_transports:- #松弛:' % env (SLACK_DSN) % '+ chatter_transports:+松:“% env (SLACK_DSN) %”#电报:“% env (TELEGRAM_DSN) %”# texter_transports: #为什么twilio: ' % env (TWILIO_DSN) % '
更新通知类路由消息根据评论文本内容(一个简单的正则表达式将做这项工作):
1 2 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通知@@ 7,6 + 7,7 @@使用Symob娱乐下载fony \组件\ \ EmailMessage通知\消息;组件使用ob娱乐下载Symfony \ \通知\ \ EmailNotificationInterface通知;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \组件\通知\接受者\ EmailRecipientInterface;+使用Syob娱乐下载mfony \组件\通知\接受者\ RecipientInterface;类CommentReviewNotification扩展通知实现EmailNotificationInterface{@@ -29 30 4 + 15 @@类CommentReviewNotification扩展通知实现EmailNotificatio返回美元消息;}++公共职能getChannels (RecipientInterface接收美元):数组+ {+如果(preg_match (' {\ b(好棒|)\ b}我,$ this - >评论- > getText ())) {+返回(“电子邮件”,“聊天/松弛”);+}++ $ this - >重要性(通知::IMPORTANCE_LOW);++返回(“电子邮件”);+}}
我们也改变了“普通”评论的重要性,因为它稍微调整设计的电子邮件。
并完成了!提交评论“awesome”一词在文本中,您应该会收到一个消息在松弛。
至于电子邮件,您可以实现ChatNotificationInterface
覆盖缺省呈现疲软的信息:
1 2 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 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通知18 @@ @@ 3 13 + 3名称空间的应用程序\通知;使用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;海尔集团实现EmailNotificationInterface CommentReviewNotification扩展了通知+类CommentReviewNotification扩展通知实现EmailNotificationInterface, ChatNotificationInterface{私人美元评论;@@ -31、6 + 36 28 @@类CommentReviewNotification扩展通知实现EmailNotificatio返回美元消息;}+公共职能asChatMessage (RecipientInterface接收美元,字符串$运输= null): ? ChatMessage+ {+如果(“松弛”! = =运输美元){+返回null;+}++ $消息= ChatMessage: fromNotification(这一点,接受美元,美元运输);+ $消息- >主题($ this - > getSubject ());新SlackOptions + $消息- >选项((())+ - > iconEmoji(“大作”)+ - > iconUrl (“https://guestbook.example.com”)+ - >用户名(“留言板”)+ - >块((新SlackSectionBlock()) - >文本($ this - > getSubject ()))+ - >块(新SlackDividerBlock ())新SlackSectionBlock + - >块((())+ - >文本(sprintf (' % s (% s)说:% s的,$ this - >评论- > getAuthor (), $ this - >评论- > getEmail (), $ this - >评论- > getText ()))+)+);++返回美元消息;+}+公共函数getChannels (RecipientInterface接收美元):数组{如果(preg_match (“{\ b(好棒|)\ b}我,$ this - >评论- > getText ())) {
这是更好的,但让我们更进一步。不是很可怕的能够接受或拒绝评论直接从松弛吗?
更改通知接受审查的URL和松弛的消息中添加两个按钮:
1 2 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 30 31 32 33 34 35
- - - / src /通知/ CommentReviewNotification.php+ + + b / src / / CommentReviewNotification.php通知@@ 3、6 + 3、7 @@名称空间的应用程序\通知;使用App \实体\评论;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackActionsBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackDividerBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackSectionBlock块;使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ SlackOptions;@@ -17 10 + 18 12 @@使用Syob娱乐下载mfony \组件\通知\接受者\ RecipientInterface;类CommentReviewNotification扩展通知实现EmailNotificationInterface ChatNotificationInterface{私人美元评论;+私人reviewUrl美元;——公共职能__construct(评论评论美元)+公共职能__construct(评论评论,美元字符串reviewUrl美元){$ this - >评论= $评论;+ $ this - > reviewUrl = $ reviewUrl;父:__construct(“新评论”);}@@ -53 6 + 56 10 @@类CommentReviewNotification扩展通知实现EmailNotificatio - >块((新SlackSectionBlock()) - >文本(sprintf (“% s (% s)说:% s的,$ this - >评论- > getAuthor (), $ this - >评论- > getEmail (), $ this - >评论- > getText ())))新SlackActionsBlock + - >块((())+ - >按钮(“接受”,$ this - > reviewUrl,“主要”)+ - >按钮(“拒绝”,$ this - > reviewUrl。”?拒绝= 1”、“危险”)+));返回美元消息;
现在跟踪改变落后的问题。首先,更新消息处理程序通过审查的URL:
1 2 3 4 5 6 7 8 9 10 11 12
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -60 60 7 + 8 @@类CommentMessageHandler实现MessageHandlerInterface $ this - >总线- >调度($消息);}elseif ($ this - >工作流- >(评论,美元“发布”)| | $ this - >工作流- >(评论美元,publish_ham)) {- $ this - >通知- >发送(新CommentReviewNotification(评论美元),…$ this - >通知- > getAdminRecipients ());+ $ = new CommentReviewNotification通知(评论,美元消息- > getReviewUrl ());+ $ this - >通知- >发送(通知、美元…$ this - >通知- > getAdminRecipients ());}elseif ($ this - >工作流- >(评论美元,“优化”)){如果($评论- > getPhotoFilename ()) {$ this - > imageOptimizer - >调整($ this - > photoDir‘/’。$评论- > getPhotoFilename ());
正如你所看到的,审查的URL应该评论信息的一部分,现在让我们将它添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
- - - / src /信息/ CommentMessage.php+ + + b / src /信息/ CommentMessage.php@@ 5,14 + 5,21 @@名称空间应用\消息;类CommentMessage{私人$ id;+私人reviewUrl美元;私人美元上下文;公共函数__construct (int $ id数组$上下文= [])+公共职能__construct (reviewUrl美元美元int id字符串数组$上下文= []){$ this - > id = $ id;+ $ this - > reviewUrl = $ reviewUrl;= $ $ this - >上下文语境;}+公共职能getReviewUrl():字符串+ {+ $ this - > reviewUrl返回;+}+公共函数getId (): int{返回$ this - > id;
最后,更新控制器生成审查URL在评论消息并将其传递给构造函数:
1 2 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 30 31 32 33 34 35 36 37 38 39
- - - / src /控制器/ AdminController.php+ + + b / src /控制器/ AdminController.php@@ -12 6 + 12 7 @@使用Syob娱乐下载mfony \组件\ HttpKernel \ HttpCache \ StoreInterface;使用Syob娱乐下载mfony \ \ HttpKernel \ KernelInterface组件;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;使用Syob娱乐下载mfony \工作流组件\ \注册;用树枝\环境;@@ -47 7 + 48 8 @@类AdminController延伸AbstractController $ this - > entityManager - >冲洗();如果(接受美元){总线- $ this - > - >调度(新CommentMessage($评论- > getId ()));+ $ reviewUrl = $ this - > generateUrl (“review_comment”, (“id”= > $评论- > getId ()], UrlGeneratorInterface:: ABSOLUTE_URL);+ $ this - >总线- >调度(新CommentMessage(评论- > getId (), reviewUrl美元));}返回新的反应($ this - >树枝>渲染(“admin / review.html。嫩枝”,(- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -17、6 + 17日7 @@使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;用树枝\环境;类ConferenceController延伸AbstractController @@ -82年7 + 83,8 @@类ConferenceController延伸AbstractController“永久链接”= > $请求- > getUri ()];总线- $ this - > - >调度(新CommentMessage (- > getId()发表评论,美元上下文));+ $ reviewUrl = $ this - > generateUrl (“review_comment”, (“id”= > $评论- > getId ()], UrlGeneratorInterface:: ABSOLUTE_URL);+ $ this - >总线- >调度(新CommentMessage(评论- > getId (), reviewUrl美元,美元上下文));$通知- >发送(新通知('谢谢你的反馈;你的评论将被审核后发布。”,(“浏览器”)));
代码解耦方法的变化更多的地方,但它更易于测试,原因,和重用。
再试一次,消息现在应该处于良好状态:
将异步
异步通知发送默认情况下,像电子邮件:
如果我们要禁用异步消息,我们会有一个轻微的问题。对于每个评论,我们收到一个电子邮件和松弛的消息。如果松弛消息错误(错误的id,频道错误的令牌,…),信使消息将被丢弃之前三次重试。但随着发送电子邮件,我们会收到3封邮件,没有松弛的消息。
当一切都是异步的,独立的消息。短信已经配置为异步的情况下,你还希望得到通知在你的手机上。