Сповіщеннявсілякимизасобами
Сповіщеннявсілякимизасобами
Застосунокгостьовоїкнигизбираєвідгукипроконференції。Алеминенайкращівнаданнізворотногозв'язкунашимкористувачам。
Оскількикоментаріпроходятьперевірку、користувачіймовірно,нерозуміють,чомуїхкоментарінепублікуютьсямиттєво。Вонинавітьможутьвідправитиїхповторно、думаючищоєякісьтехнічніпроблеми。Булобчудовонадатиїмзворотнийзв'язок,післяпублікаціїкоментаря。
Крімтого,ми、мабутьмаємосповіститиїх,яктількиїхкоментарбулоопубліковано。Мипросимовказатиїхадресуелектронноїпошти,томунамкращевикористовуватиїї。
Існуєбезлічспособівоповіщеннякористувачів。Електроннапошта——цепершийзасіб,проякийвиможетеподумати,алесповіщенняувеб-застосунку——цещеодинзасіб。МимоглибнавітьподуматипровідправкуSMS-повідомлень,відправкуповідомленняу松弛або电报。Єбагатоваріантів。
КомпонентSob娱乐下载ymfony通知реалізуєбагатостратегійоповіщення。
Відправкасповіщеньвеб-застосункувбраузері
Уякостіпершогокрокусповістімокористувачівпроте,щокоментаріпроходятьперевірку——безпосередньовбраузері,післяїхвідправки:
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
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -15 6 + 15 8 @@使用Syob娱乐下载mfony \ HttpFoundation \ \组件文件\ \ FileException异常;使用Syob娱乐下载mfony \ HttpFoundation \ \组件请求;组件使用ob娱乐下载Symfony \ \ HttpFoundation \反应;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \组件\ \通知\通知通知;+使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;类ConferenceController延伸AbstractController @@ -46年6 + 48岁,7美元@@类ConferenceController扩展AbstractController请求请求,会议会议上,美元CommentRepository CommentRepository美元,+ NotifierInterface通知美元,#【自动装配(% photo_dir %)]字符串photoDir美元,反应):{$评论=新的评论();@@ -74、9 + 77,15 @@类ConferenceController延伸AbstractController];$ this - >总线- >调度(新CommentMessage (- > getId()发表评论,美元上下文));+ $通知- >发送(新通知('谢谢你的反馈;你的评论将被审核后发布。”,(“浏览器”)));+返回$ this - > redirectToRoute(“会议”,(“鼻涕虫”= > $会议- > getSlug ()));}+如果($形式- > isSubmitted ()) {+ $通知- >发送(新通知(“你能检查你的提交吗?有一些问题。”,(“浏览器”)));+}+抵消美元= max(0, $请求- >查询- > getInt(“抵消”,0));$ paginator = $ commentRepository - > getCommentPaginator(会议,抵消美元);
Сповіщувачвідправляєсповіщеннядоотримувачівзадопомогоюканалу
Усповіщенняєтема,необов'язковийзмістірівеньважливості。
Сповіщеннявідправляєтьсязадопомогоюодногоабодекількохканалів,залежновідрівняйоговажливості。Виможетевідправлятитерміновісповіщення、наприкладзадопомогоюSMS,азвичайні——задопомогоюелектронноїпошти。
Длясповіщеньбраузераунаснемаєодержувачів。
Сповіщеннябраузеравикористовуємиттєвіповідомленнязадопомогоюсекції通知。Мимаємовідобразитиїх,оновившишаблонконференції:
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 >{{会议}}会议
Теперкористувачібудутьсповіщеніпроте,щоїхподанняпроходитьперевірку:
Уякостідодатковогобонусуунасєприємнесповіщенняуверхнійчастинівеб-сайту,якщоуформієпомилка:
提示
МиттєвіповідомленнявикористовуютьсистемуHTTP-сесіївякостіносіяданих。Головнимнаслідкомцьогоєте,щоHTTP-кешвимкнено,оскількисистемасесіймаєбутизапущена,щобперевіритиповідомлення。
Самезцієїпричинимидодалифрагментмиттєвихповідомленьушаблон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
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ 4,15 + 4,15 @@名称空间应用\ 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 @@类CommentMessageHandler私有CommentRepository CommentRepository美元,美元私人MessageBusInterface巴士,私人WorkflowInterface commentStateMachine美元,——美元私人MailerInterface梅勒,- #【自动装配(% admin_email %)]私人字符串adminEmail美元,+私人NotifierInterface通知美元,私人ImageOptimizer ImageOptimizer美元,#【自动装配(% photo_dir %)]私人字符串photoDir美元,私人? LoggerInterface $记录器= null, @@ -50年13 + 49岁7 @@类CommentMessageHandler $ this - > entityManager - >冲洗();$ this - >总线- >调度($消息);}elseif ($ this - > commentStateMachine - >(评论,美元“发布”)| | $ this - > commentStateMachine - >(评论美元,publish_ham)) {- $ this - >梅勒- >发送((新NotificationEmail ())- - - - - - - >主题(“新评论”)- - > htmlTemplate(邮件/ comment_notification.html.twig)- - > ($ this - > adminEmail)- - > ($ this - > adminEmail)- - - - - - - >上下文([“评论”= >评论美元])-);+ $ this - >通知- >发送(新CommentReviewNotification(评论美元),…$ this - >通知- > getAdminRecipients ());}elseif ($ this - > commentStateMachine - >(评论美元,“优化”)){如果($评论- > 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”一词,ми,можливо,захочемоприйнятийогошвидше,ніжінші。
Длятакихповідомленьмихочемоотримуватисповіщеннявтакійсистеміобмінумиттєвимиповідомленнями,як松弛або电报,надодатокдозвичайногоелектронноголиста。
Встановітьпідтримку松弛дляSymfonyob娱乐下载通知:
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{@@ -26年4 + 27日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{公共职能__construct(私人评论评论,美元@@ -28年6 + 33岁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
- - - / 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扩展通知实现EmailNotificatio{公共职能__construct(私人评论评论,美元+私人字符串reviewUrl美元,){父:__construct(“新评论”);6 + 52}@@ -50年,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@@ -49 7 + 49 8 @@类CommentMessageHandler $ this - > entityManager - >冲洗();$ this - >总线- >调度($消息);}elseif ($ this - > commentStateMachine - >(评论,美元“发布”)| | $ this - > commentStateMachine - >(评论美元,publish_ham)) {- $ this - >通知- >发送(新CommentReviewNotification(评论美元),…$ this - >通知- > getAdminRecipients ());+ $ = new CommentReviewNotification通知(评论,美元消息- > getReviewUrl ());+ $ this - >通知- >发送(通知、美元…$ this - >通知- > getAdminRecipients ());}elseif ($ this - > commentStateMachine - >(评论美元,“优化”)){如果($评论- > 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
- - - / src /信息/ CommentMessage.php+ + + b / src /信息/ CommentMessage.php@@ 6、10 + 6、16 @@类CommentMessage{公共函数__construct(私人int id,美元+私人字符串reviewUrl美元,私人数组$上下文= []){}+公共职能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 \工作流组件\ \ WorkflowInterface;用树枝\环境;@@ -42 43 7 + 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@@ -18 6 + 18 7 @@使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;类ConferenceController延伸AbstractController{@@ -75、7 + 76、8 @@类ConferenceController延伸AbstractController“推荐人”= >请求- >标题- >获取美元(“推荐人”)、“永久链接”= > $请求- > getUri ()];总线- $ this - > - >调度(新CommentMessage (- > getId()发表评论,美元上下文));+ $ reviewUrl = $ this - > generateUrl (“review_comment”, (“id”= > $评论- > getId ()], UrlGeneratorInterface:: ABSOLUTE_URL);+ $ this - >总线- >调度(新CommentMessage(评论- > getId (), reviewUrl美元,美元上下文));$通知- >发送(新通知('谢谢你的反馈;你的评论将被审核后发布。”,(“浏览器”)));
Декомпозиціякодуозначаєзмінивбільшійкількостімісць,алецеполегшуєтестування,аналізіповторневикористання。
Спробуйтещераз,теперповідомленнямаєбутиувідповідномувигляді:
Перехіддоасинхронностіувсіхнапрямках
Сповіщення,як-отелектроннілисти,зазамовчуваннямнадсилаютьсяасинхронно。
Якбимивимкнулиасинхронніповідомлення,унасвиниклабневеликапроблема。Длякожногокоментарямиотримуємоповідомленняелектронноїпоштийповідомлення松弛。Якщовповідомленні松弛єпомилки(неправильнийідентифікаторканалу,неправильнийтокен,…),信使будевідправлятиповідомленняповторнотрирази,першніжвідкинейого。Алеоскількиповідомленняелектронноїпоштивідправляєтьсяпершим,миотримаємо3повідомленняелектронноїпоштийжоднихповідомлень松弛。
Яктількивсестаєасинхронним,повідомленнястаютьнезалежними。SMS-повідомленнявженалаштованіякасинхроннінатойвипадок,якщовитакожхочетеотримуватисповіщеннянаваштелефон。
Сповіщеннякористувачівзадопомогоюелектронноїпошти
Останнєзавдання——повідомитикористувачів,колиїхподаннябудесхвалено。Аякщодотого,щобдозволитивамреалізуватицесамостійно吗?
Йдемодалі