Уведомлениеразличнымиспособами
Уведомлениеразличнымиспособами
Приложениегостевойкнигисобираетотзывыоконференциях。Мыхотимулучитьобратнуюсвязьснашимипользователями。
Пользователи、вероятнонепонимают,чтокомментарийнаходитсянапроверке,поэтомунепубликуетсямгновенно。Поэтойпричинеонимогутповторноегоотправить,думая,чтопроизошлатехническаяошибка。Былобыздоровоуведомитьихпослеотправкикомментария。
Крометого,хорошобыимсообщить,когдакомментарийбудетопубликован。Мыпросимпользователейуказатьэлектроннуюпочту,давайтеиспользоватьеё。
Существуетмногоспособовуведомитьпользователей。Электроннаяпочта——этопервое,чтоприходитвголову,хотямытакжеможемсделатьэтоинасамомсайте。Отправка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(会议,抵消美元);
Уведомительотправляетуведомлениеполучателямпоканалу。
Уведомлениесостоитизтемы,необязательногосодержанияиважности。
Уведомлениеотправляетсяпоодномуилинесколькимканаламвзависимостиотважности。Например,выможетеотправлятьсрочныеуведомленияпоСМС,аобычные——поэлектроннойпочте。
Убраузерныхуведомленийнетполучателей。
Дляуведомленийвбраузереиспользуютсямгновенныесообщениястипом通知。Чтобывывестиих,намнужнообновитьшаблонконференции:
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
。
Уведомлениеадминистраторовпоэлектроннойпочте
Вместоотправкиадминистраторуэлектронногописьмаоновомкомментарииспомощью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 ());
Каквидите,проверочныйадресдолженбытьвсамомсообщении,поэтомудобавляемего:
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;
Инаконец,сгенерируйтеадреспроверкикомментариявконтроллере,азатемпередайтееговконструкторсообщения:
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美元,美元上下文));$通知- >发送(新通知('谢谢你的反馈;你的评论将被审核后发布。”,(“浏览器”)));
Декомпозициякодапредполагаетизменениявбольшемколичествемест,нозатоонаоблегчаеттестирование,анализиповторноеиспользование。
Попробуйтеещёраз:сообщениедолжнобытьправильным:
Включениеасинхронногорежимадлявсехканалов
Уведомленияотправляютсяасинхроннопоумолчанию,какэлектронныеписьма:
Еслибымывыключилиотправкусообщенийасинхронно,унасвозниклабынебольшаяпроблема。Прикаждомдобавленномкомментариимыполучаемэлектронноеписьмоисообщениев松弛。ЕслиприотправкеSlack-сообщениявозникаетошибка(неправильныйидентификаторканала,неверныйтокенит.п),топроизойдётповторнаяотправкасообщениятрираза,преждечемонобудетотклонено。Нопосколькусначалаотправляетсяуведомлениепопочте,товитогеунасбудут3электронныхписьмаиниодногосообщенияв松弛。
Послетого,каквовсеканалысообщенияотправляютсяасинхронно,тосамисообщенияперестаютзависетьдруготдруга。Наслучай,есливампонадобитсяполучатьуведомлениянасвойтелефон,уженастроенаасинхроннаяпересылкаSMS-сообщений。
Уведомлениепользователейпоэлектроннойпочте
Последняязадача——уведомитьпользователей,когдаихкомментарийбудетодобрен。Какнасчёттого,чтобыреализоватьэтосамостоятельно吗?
Двигаемсядальше