Уведомление с азли и а н м м способам м

Уведомление с азли и а н м м способам м

Приложениегостевойкнигисобираетотзывыоконференциях。Мыхотимулучитьобратнуюсвязьснашимипользователями。

Пользователи,вероятно,непонимают,чтокомментарийнаходитсянапроверк,епоэтомунепубликуетсямгновенно。Поэтойпричинеонимогутповторноегоотправить,думая,чтопроизошлатехническаяошибка。Былобыздоровоуведомитьихпослеотправкикомментария。

Крометого,хорошобыимсообщить,когдакомментарийбудетопубликован。Мыпросимпользователейуказатьэлектроннуюпочту,давайтеиспользоватьеё。

Существуетмногоспособовуведомитьпользователей。Электроннаяпочта-этопервое,чтоприходитвголову,хотямытакжеможемсделатьэтоинасамомсайте。ОтправкаSMS -сообщенийилиуведомленийв松弛или电报——выможетевыбратьлюбойизвариантов。

КомпонентSob娱乐下载ymfony通知предлагаетмножествостратегийуведомления。

Отправка у у едо омлени т в с с с с

Дляначаладавайтеуведомимпользователейнепосредственновбраузере,чтоихкомментариипроверяютсяпослеотправки:

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
——/ 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 \组件\路由\注释\路线;用树枝\环境;@@ -53,7 +55,7 @@ class ConferenceController extends AbstractController} #[路由('/conference/{slug}',名称:'conference')]-公共功能显示(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository, string $photoDir):响应+公共函数show(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository, NotifierInterface $notifier, string $photoDir):响应{$comment = new comment ();$form = $this->createForm(CommentFormType::class, $comment);@@ -82,9 +84,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);

Уведомительотправляетуведомлениеполучателямпоканалу

Уведомлениесостоитизтемы,необязательногосодержанияиважности。

Уведомлениеотправляетсяпоодномуилинесколькимканаламвзависимостиотважности。Например,выможетеотправлятьсрочныеуведомленияпоСМС,аобычны,епоэлектроннойпочте。

У б а с с с е ен омлени л не е пол ол л тел。

Для у у едомлени т в б а с с ер испол л з т тсмгновенныесообщениястипом通知.Чтобывывестиих,намнужнообновитьшаблонконференции:

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}}会议

Теперьпользователиувидят,чтоихкомментарийпроверяется:

/会议/阿姆斯特丹- 2019

Авкачествеприятногодополнениявверхнейчастисайтапоявитсякрасивоеуведомление,есливозникнетошибкапризаполненииформы:

/会议/阿姆斯特丹- 2019

提示

Мгновенные сообщения хранятся вHTTP -сессии.ИменнопоэтомуHTTP -запросы,использующиесессию,некешируютсяпоумолчанию,таккаксессиядолжнабытьзапущена,чтобыпроверитьновыесообщения。

Вотпочему、чтобыкешироватьглавнуюстраниц,умыдобавиливыводмгновенныхсообщенийнебазовомшаблоне,авshow.html.twig

Уведомление администраторов по о лект о онно по и т

ВместоотправкиадминистраторуэлектронногописьмаоновомкомментарииспомощьюMailerInterface,воспользуемсякомпонентом通知вобработчикесообщений:

12 34 56 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@@命名空间应用程序\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 private $commentRepository;私人美元总线;私人美元工作流;- private $mailer;+私人$通知;私人imageOptimizer美元;- private $adminEmail;私人photoDir美元;私人美元记录器;-公共函数__construct(EntityManagerInterface $entityManager, SpamChecker $ SpamChecker, CommentRepository $ CommentRepository, MessageBusInterface $bus, WorkflowInterface $commentStateMachine, MailerInterface $mailer, ImageOptimizer $ ImageOptimizer, string $adminEmail, string $photoDir, LoggerInterface $logger = null)+公共函数__construct(EntityManagerInterface $entityManager, SpamChecker $ SpamChecker, CommentRepository $ CommentRepository, MessageBusInterface $bus, WorkflowInterface $commentStateMachine, NotifierInterface $notifier, ImageOptimizer $ ImageOptimizer, string $photoDir, LoggerInterface $logger = null){$this->entityManager = $entityManager;$this->spamChecker = $spamChecker;$this->commentRepository = $commentRepository;$this->总线= $bus;$this->工作流= $commentStateMachine;$this->mailer = $mailer;+ $this->通知= $通知;$this->imageOptimizer = $imageOptimizer;- $this->adminEmail = $adminEmail;$this->photoDir = $photoDir;$this->记录器= $记录器;} @@ -62,13 +60,7 @@类CommentMessageHandler实现MessageHandlerInterface $this->总线->调度($message);} elseif ($this->workflow->can($comment, 'publish') || $this->workflow->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->workflow->can($comment, 'optimize')) {if ($comment->getPhotoFilename()) {$this->imageOptimizer->resize($this->photoDir.'/'.$comment->getPhotoFilename());

МетодgetAdminRecipients ()возвращаетсписокадминистраторов,которыхнеобходимоуведомить;доба а а н т в нн е о о с о ро о о о о о онн о по и т:

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

src /通知/ CommentReviewNotification.php
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 30
名称空间应用程序通知使用应用程序实体评论使用ob娱乐下载组件通知人消息EmailMessage使用ob娱乐下载组件通知人通知EmailNotificationInterface使用ob娱乐下载组件通知人通知通知使用ob娱乐下载组件通知人收件人EmailRecipientInterfaceCommentReviewNotification扩展通知实现了EmailNotificationInterface私人评论公共函数__construct(评论评论->评论=评论::__construct (“发布了新评论”);}公共函数asEmailMessage(EmailRecipientInterface收件人、字符串运输= null): ?EmailMessage消息= EmailMessage::fromNotification (收件人运输);消息->getMessage ()->htmlTemplate (“电子邮件/ comment_notification.html.twig”->上下文([“评论”= >->评论]);返回消息;}}

НеобязательныйметодasEmailMessage ()интерфейсаEmailNotificationInterfaceпоз оо ле т и ит сообщение р лектронн но о к почты。

Однимизпреимуществиспользования通知вместосоответствующегокомпонентадляотправкипочтынапрямуюсостоитвтом,чтоонотделяетуведомлениеотвыбранного“канала”。Тоесть,каквывидит,енетявногоуказания,чтоуведомлениедолжнобытьотправленопоэлектроннойпочте。

Вместо т то о о о ка анал наст т аи ива аетс в ф - а - т ле配置/包/ notifier.yamlи а аетс с в за а симост о оважностиуведомления(поумолчанию):

配置/包/ notifier.yaml
1 2 3 4 5 6 7 8
框架:通知:channel_policy:#使用chat/slack, chat/telegram, sms/twilio或sms/nexmo紧急:['邮件']高:['邮件']介质:['邮件']低:['邮件']

Мы сс смот ели каналы浏览器и电子邮件.Давайтепосмотримнадруги,еболееинтересныеисложные。

Отправка ведомлени т в чаты дл администраторов

Давайтебудемчестны:мывсеожидаемположительныхили,покрайнеймере,конструктивныхотзывов。Есликто——тонапишеткомментарийсословами“伟大”или“awesome”一词,мы,скореевсего,одобримегобыстрее。

Такиесообщенияхочетсяполучатьнетолькопоэлектроннойпочт,еноивчатах,например,в松弛или电报。

Добавьте поддержку Slack дл Sob娱乐下载ymfony Notifier:

1
ob娱乐下载Symfony作曲家要求懈怠通知

ДляначаласформируйтестрокуподключенияDSNдля松弛стокеномдоступаиидентификаторомканала松弛,кудавыхотитеотправлятьсообщения:松:/ / ACCESS_TOKEN@default ?通道=通道

Посколькутокендоступаотноситсякконфиденциальнойинформаци,итосохранитеDSN(строку松弛всоответствующемхранилище:

1
ob娱乐下载Symfony控制台的秘密:SLACK_DSN

Проделайте то о же сам мо од л прод к к о и ена:

1
ob娱乐下载Symfony控制台的秘密:SLACK_DSN - env =刺激

Включите поддержку Chatter в Slack:

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)%'

Обновитеклассуведомления,чтобыотправлятьсообщениявнужныеканалы,взависимостиотсодержаниякомментария(сэтимсправитсяпростоерегулярноевыражение):

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;类CommentReviewNotification扩展通知实现EmailNotificationInterface{@@ -29,4 +30,15 @@类CommentReviewNotification扩展通知实现EmailNotificatio返回$message;}++公共函数getChannels(RecipientInterface $ receiver):数组+ {+如果(preg_match (' {\ b(好棒|)\ b}我,$ this - >评论> getText ())) {+ return ['email', 'chat/slack'];+}++ $ this - >重要性(通知::IMPORTANCE_LOW);++ return ['email'];+}

Мытакжеизмениливажность”обычных“комментариев,таккаконислегкаизменяютдизайнписьма。

Готово!Отправьтекомментарий,содержащийслово“awesome”ивчатев疲软ыувидитеэтоткомментарий。

Поаналогиисэлектроннымписьмом,вытакжеможетеизменитьстандартноеоформлениесообщенияв松弛,еслиреализуетеинтерфейсChatNotificationInterface

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{私人$评论;@@ -31,6 +36,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())) {

Так-то лу у а а т т по о д и м ещё дал е。Развенебылобыздоровоодобритьилиотклонитькомментарийнепосредственнов松弛吗?

Изменитеуведомление,чтобыонопринималоURL -адреспроверкикомментарияидобавьтедвекнопкивсообщение松弛:

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
——/ src / / CommentReviewNotification.php通知+ + + b / src / / CommentReviewNotification.php通知@@ -3,6 +3,7 @@名称空间的应用程序\通知;使用App \实体\评论;+使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ \ SlackActionsBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackDividerBlock块;桥组件使ob娱乐下载用Symfony \ \通知\ \松弛\ \ SlackSectionBlock块;使用Syob娱乐下载mfony \桥组件\通知\ \松弛\ SlackOptions;@@ Symfony\Component\Notob娱乐下载ifier\ receiver \RecipientInterface;类CommentReviewNotification扩展Notification实现EmailNotificationInterface, ChatNotificationInterface {private $comment;+ private $reviewUrl;-公共函数__construct(Comment $ Comment)+公共函数__construct(注释$注释,字符串$reviewUrl){$this->comment = $comment;+ $this->reviewUrl = $reviewUrl;parent::__construct('新评论发布');} @@ -53,6 +56,10 @@类CommentReviewNotification扩展通知实现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”、“危险”)+));返回美元消息;

Теперьмыбудемвноситьизменениявобратномпорядке。ДляначалаобновитеобработчиксообщенияипередайтевнегоURL -адреспроверкикомментария:

12 3 4 5 6 7 8 9 10 11 12
——MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -60,7 +60,8 @@类CommentMessageHandler实现MessageHandlerInterface $this->总线->调度($message);} elseif ($this->workflow->can($comment, 'publish') || $this->workflow->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->workflow->can($comment, 'optimize')) {if ($comment->getPhotoFilename()) {$this->imageOptimizer->resize($this->photoDir.'/'.$comment->getPhotoFilename());

,Каквидитепроверочныйадресдолженбытьвсамомсообщении,поэтомудобавляемего:

12 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 @@命名空间App\消息;class CommentMessage {private $id;+ private $reviewUrl;私人美元上下文;-公共函数__construct(int $id,数组$context = [])+公共函数__construct(int $id,字符串$reviewUrl,数组$context = []){$this->id = $id;+ $this->reviewUrl = $reviewUrl;$this->context = $context;}+公共函数getReviewUrl():字符串+ {+返回$this->reviewUrl;+}+公共函数getId(): int{返回$this->id;

Инаконец,сгенерируйтеадреспроверкикомментариявконтроллере,азатемпередайтееговконструкторсообщения:

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 \工作流组件\ \注册;用树枝\环境;@@类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@@ Symfony\Component\Mob娱乐下载essenger\MessageBusInterface;使用Syob娱乐下载mfony \组件\ \通知\通知通知;使用Syob娱乐下载mfony \ \通知\ NotifierInterface组件;使用Syob娱乐下载mfony \组件\路由\注释\路线;+使用Syob娱乐下载mfony \组件\ \发电机\ UrlGeneratorInterface路由;用树枝\环境;类ConferenceController extends AbstractController '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(新的通知('谢谢你的反馈;您的评论将在审核后发布。”,(“浏览器”)));

Декомпозициякодапредполагаетизменениявбольшемколичествемест,нозатоонаоблегчаеттестирование,анализиповторноеиспользование。

Попробуйтеещёраз:сообщениедолжнобытьправильным:

Включение асинхронного режима дл все каналов

Уведомленияотправляютсяасинхроннопоумолчанию,какэлектронныеписьма:

配置/包/ messenger.yaml
1 2 3 4 5 6 7 8 9
框架:信使:路由:ob娱乐下载Symfony \组件\梅勒\ \ SendEmailMessage使者:异步ob娱乐下载Symfony \组件\消息通知\ \ ChatMessage:异步ob娱乐下载Symfony \组件\消息通知\ \ SmsMessage:异步#将您的消息发送到传送器应用程序消息\ \ CommentMessage:异步

Еслибымывыключилиотправкусообщенийасинхронно,унасвозниклабынебольшаяпроблема。Прикаждомдобавленномкомментариимыполучаемэлектронноеписьмоисообщениев松弛。Еслиприотправке松弛——сообщениявозникаетошибка(неправильныйидентификаторканала,неверныйтокенитп。),топроизойдётповторнаяотправкасообщениятрираза,преждечемонобудетотклонено。Нопосколькусначалаотправляетсяуведомлениепопочт,етовитогеунасбудут3электронныхписьмаиниодногосообщенияв松弛。

,Послетогокаквовсеканалысообщенияотправляютсяасинхронно,тосамисообщенияперестаютзависетьдруготдруга。Наслучай,есливампонадобитсяполучатьуведомлениянасвойтелефон,уженастроенаасинхроннаяпересылкаSMS -сообщений。

Уведомление пол л зо а ателе о о ект о онн но о пол л о т т

Последняязадача-уведомитьпользователей,когдаихкомментарийбудетодобрен。Какнасчёттого,чтобыреализоватьэтосамостоятельно吗?

此工作,包括代码示例,是根据知识共享协议BY-NC-SA 4.0许可证。