خطوة 25: إشعار من قبل جميع وسائل

5.0 version
Maintained

إشعار من قبل جميع وسائل

تطبيق سجل الزوار يجمع ردود الفعل حول المؤتمرات. لكننا لسنا رائعين في تقديم تعليقات لمستخدمينا.

نظرًا لأن التعليقات خاضعة للإشراف ، فربما لا يفهمون سبب عدم نشر تعليقاتهم على الفور. حتى أنهم قد يعيدون تقديمهم معتقدًا أن هناك بعض المشكلات الفنية. سيكون إعطاءهم تعليقًا بعد نشر تعليق أمرًا رائعًا.

وأيضًا ، ربما يجب علينا اختبار الأمر عند نشر تعليقهم. نطلب بريدهم الإلكتروني ، لذلك من الأفضل استخدامه.

هناك العديد من الطرق لإعلام المستخدمين. البريد الإلكتروني هو الوسيلة الأولى التي قد تفكر فيها ، ولكن الإخطارات في تطبيق الويب هي وسيلة أخرى.يمكننا التفكير في إرسال رسائل نصية أو نشر رسالة على Slack أو Telegram. هناك العديد من الخيارات.

يطبق مكون Symfony Notifier Component استراتيجيات إعلام عديدة:

1
$ symfony composer req notifier

إرسال إشعارات تطبيق الويب في المستعرض

كخطوة أولى ، دعنا نخطر المستخدمين بأن التعليقات يتم الإشراف عليها مباشرة في المتصفح بعد إرسالها:

patch_file
 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
--- a/src/Controller/ConferenceController.php
+++ b/src/Controller/ConferenceController.php
@@ -14,6 +14,8 @@ use Symfony\Component\HttpFoundation\File\Exception\FileException;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Messenger\MessageBusInterface;
+use Symfony\Component\Notifier\Notification\Notification;
+use Symfony\Component\Notifier\NotifierInterface;
 use Symfony\Component\Routing\Annotation\Route;
 use Symfony\Component\Workflow\Registry;
 use Twig\Environment;
@@ -60,7 +62,7 @@ class ConferenceController extends AbstractController
     /**
      * @Route("/conference/{slug}", name="conference")
      */
-    public function show(Request $request, Conference $conference, CommentRepository $commentRepository, string $photoDir)
+    public function show(Request $request, Conference $conference, CommentRepository $commentRepository, NotifierInterface $notifier, string $photoDir)
     {
         $comment = new Comment();
         $form = $this->createForm(CommentFormType::class, $comment);
@@ -90,9 +92,15 @@ class ConferenceController extends AbstractController

             $this->bus->dispatch(new CommentMessage($comment->getId(), $context));

+            $notifier->send(new Notification('Thank you for the feedback; your comment will be posted after moderation.', ['browser']));
+
             return $this->redirectToRoute('conference', ['slug' => $conference->getSlug()]);
         }

+        if ($form->isSubmitted()) {
+            $notifier->send(new Notification('Can you check your submission? There are some problems with it.', ['browser']));
+        }
+
         $offset = max(0, $request->query->getInt('offset', 0));
         $paginator = $commentRepository->getCommentPaginator($conference, $offset);

المشعر يرسل إشعارا الى المُستقبل بواسطة قناة

يحتوي الإشعار على موضوع ومحتوى اختياري وأهمية.

يتم إرسال إشعار على قناة واحدة أو العديد من القنوات حسب أهميتها. يمكنك إرسال إشعارات عاجلة عن طريق الرسائل القصيرة وتلك العادية عبر البريد الإلكتروني على سبيل المثال.

لإشعارات المتصفح ، ليس لدينا مستلمون.

يستخدم إشعار المستعرض رسائل فلاش عبر القسم إعلام. نحتاج إلى عرضها من خلال تحديث قالب المؤتمر:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
--- a/templates/conference/show.html.twig
+++ b/templates/conference/show.html.twig
@@ -3,6 +3,13 @@
 {% block title %}Conference Guestbook - {{ conference }}{% endblock %}

 {% block body %}
+    {% for message in app.flashes('notification') %}
+        <div class="alert alert-info alert-dismissible fade show">
+            {{ message }}
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+        </div>
+    {% endfor %}
+
     <h2 class="mb-5">
         {{ conference }} Conference
     </h2>

سيتم إعلام المستخدمين الآن بأن عملية إرسالهم خاضعة للإشراف:

كمكافأة إضافية ، لدينا إخطار جيد في الجزء العلوي من الموقع إذا كان هناك خطأ في النموذج:

Tip

تستخدم رسائل الفلاش نظام * جلسة HTTP * كوسيط تخزين. النتيجة الرئيسية هي أن ذاكرة التخزين المؤقت HTTP معطلة حيث يجب بدء تشغيل نظام الجلسة للتحقق من الرسائل.

هذا هو السبب في أننا أضفنا مقتطفات رسائل الفلاش في قالب `` show.html.twig`` وليس في الأساس ؛ لأننا فقدنا ذاكرة التخزين المؤقت HTTP للصفحة الرئيسية.

إخطار المسؤولين عن طريق البريد الإلكتروني

بدلاً من إرسال بريد إلكتروني عبر `` MailerInterface`` لإخطار المسؤول بأنه قد تم نشر تعليق للتو ، بدّل لاستخدام مكون Notifier في معالج الرسائل:

patch_file
 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
--- a/src/MessageHandler/CommentMessageHandler.php
+++ b/src/MessageHandler/CommentMessageHandler.php
@@ -4,14 +4,14 @@ namespace App\MessageHandler;

 use App\ImageOptimizer;
 use App\Message\CommentMessage;
+use App\Notification\CommentReviewNotification;
 use App\Repository\CommentRepository;
 use App\SpamChecker;
 use Doctrine\ORM\EntityManagerInterface;
 use Psr\Log\LoggerInterface;
-use Symfony\Bridge\Twig\Mime\NotificationEmail;
-use Symfony\Component\Mailer\MailerInterface;
 use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
 use Symfony\Component\Messenger\MessageBusInterface;
+use Symfony\Component\Notifier\NotifierInterface;
 use Symfony\Component\Workflow\WorkflowInterface;

 class CommentMessageHandler implements MessageHandlerInterface
@@ -21,22 +21,20 @@ class CommentMessageHandler implements MessageHandlerInterface
     private $commentRepository;
     private $bus;
     private $workflow;
-    private $mailer;
+    private $notifier;
     private $imageOptimizer;
-    private $adminEmail;
     private $photoDir;
     private $logger;

-    public function __construct(EntityManagerInterface $entityManager, SpamChecker $spamChecker, CommentRepository $commentRepository, MessageBusInterface $bus, WorkflowInterface $commentStateMachine, MailerInterface $mailer, ImageOptimizer $imageOptimizer, string $adminEmail, string $photoDir, LoggerInterface $logger = null)
+    public function __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 = $bus;
         $this->workflow = $commentStateMachine;
-        $this->mailer = $mailer;
+        $this->notifier = $notifier;
         $this->imageOptimizer = $imageOptimizer;
-        $this->adminEmail = $adminEmail;
         $this->photoDir = $photoDir;
         $this->logger = $logger;
     }
@@ -62,13 +60,7 @@ class CommentMessageHandler implements MessageHandlerInterface

             $this->bus->dispatch($message);
         } elseif ($this->workflow->can($comment, 'publish') || $this->workflow->can($comment, 'publish_ham')) {
-            $this->mailer->send((new NotificationEmail())
-                ->subject('New comment posted')
-                ->htmlTemplate('emails/comment_notification.html.twig')
-                ->from($this->adminEmail)
-                ->to($this->adminEmail)
-                ->context(['comment' => $comment])
-            );
+            $this->notifier->send(new CommentReviewNotification($comment), ...$this->notifier->getAdminRecipients());
         } elseif ($this->workflow->can($comment, 'optimize')) {
             if ($comment->getPhotoFilename()) {
                 $this->imageOptimizer->resize($this->photoDir.'/'.$comment->getPhotoFilename());

تقوم الطريقة getAdminRecipients () بإرجاع مستلمي المشرف كما تم تكوينهم في تكوين المخطر ؛ قم بتحديثه الآن لإضافة عنوان بريدك الإلكتروني:

patch_file
1
2
3
4
5
6
7
8
--- a/config/packages/notifier.yaml
+++ b/config/packages/notifier.yaml
@@ -13,4 +13,4 @@ framework:
             medium: ['email']
             low: ['email']
         admin_recipients:
-            - { email: [email protected] }
+            - { email: "%env(string:default:default_admin_email:ADMIN_EMAIL)%" }

الآن ، قم بإنشاء فئة `` CommentReviewNotification``:

src/Notification/CommentReviewNotification.php
 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
namespace App\Notification;

use App\Entity\Comment;
use Symfony\Component\Notifier\Message\EmailMessage;
use Symfony\Component\Notifier\Notification\EmailNotificationInterface;
use Symfony\Component\Notifier\Notification\Notification;
use Symfony\Component\Notifier\Recipient\Recipient;

class CommentReviewNotification extends Notification implements EmailNotificationInterface
{
    private $comment;

    public function __construct(Comment $comment)
    {
        $this->comment = $comment;

        parent::__construct('New comment posted');
    }

    public function asEmailMessage(Recipient $recipient, string $transport = null): ?EmailMessage
    {
        $message = EmailMessage::fromNotification($this, $recipient, $transport);
        $message->getMessage()
            ->htmlTemplate('emails/comment_notification.html.twig')
            ->context(['comment' => $this->comment])
        ;

        return $message;
    }
}

طريقة asEmailMessage () من `` EmailNotificationInterface`` اختيارية ، لكنها تسمح بتخصيص البريد الإلكتروني.

تتمثل إحدى فوائد استخدام Notifier بدلاً من مرسل البريد مباشرة في إرسال رسائل البريد الإلكتروني في إلغاء فصل الإشعار من "القناة" المستخدمة في ذلك. كما ترى ، لا شيء يقول صراحة أنه يجب إرسال الإشعار عبر البريد الإلكتروني.

بدلاً من ذلك ، يتم تكوين القناة في config/packages/notifier.yaml اعتمادًا على * أهمية * الإشعار (low بشكل افتراضي):

config/packages/notifier.yaml
1
2
3
4
5
6
7
8
framework:
notifier:
    channel_policy:
        # use chat/slack, chat/telegram, sms/twilio or sms/nexmo
        urgent: ['email']
        high: ['email']
        medium: ['email']
        low: ['email']

لقد تحدثنا عن browser وقنوات email. دعونا نرى بعض مربو الحيوانات.

الدردشة مع المسؤولين

دعونا نكون صادقين ، ونحن جميعا ننتظر ردود فعل إيجابية. أو على الأقل ردود الفعل البناءة. إذا نشر شخص ما تعليقًا بكلمات مثل "رائع" أو "رائع" ، فقد نرغب في قبولها بشكل أسرع من الآخرين.

لمثل هذه الرسائل ، نريد أن يتم تنبيهك على نظام المراسلة الفورية مثل Slack أو Telegram بالإضافة إلى البريد الإلكتروني العادي.

تثبيت دعم Slack لـ Symfony Notifier:

1
$ symfony composer req slack-notifier

للبدء ، قم بإنشاء Slack DSN مع رمز وصول Slack ومعرف قناة Slack حيث تريد إرسال رسائل:slack://ACCESS_TOKEN@default?channel=CHANNEL.

نظرًا لأن رمز الوصول حساس ، قم بتخزين Slack DSN في المتجر السري:

1
$ symfony console secrets:set SLACK_DSN

تفعل الشيء نفسه بالنسبة للإنتاج:

1
$ APP_ENV=prod symfony console secrets:set SLACK_DSN

تمكين المدردشين من دعم Slack

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
--- a/config/packages/notifier.yaml
+++ b/config/packages/notifier.yaml
@@ -1,7 +1,7 @@
 framework:
     notifier:
-        #chatter_transports:
-        #    slack: '%env(SLACK_DSN)%'
+        chatter_transports:
+            slack: '%env(SLACK_DSN)%'
         #    telegram: '%env(TELEGRAM_DSN)%'
         #texter_transports:
         #    twilio: '%env(TWILIO_DSN)%'

قم بتحديث فئة الإشعارات لتوجيه الرسائل اعتمادًا على محتوى نص التعليق (ستقوم ريجكس البسيطة بالمهمة):

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
--- a/src/Notification/CommentReviewNotification.php
+++ b/src/Notification/CommentReviewNotification.php
@@ -27,4 +27,15 @@ class CommentReviewNotification extends Notification implements EmailNotificationInterface
             ->context(['comment' => $this->comment])
         );
     }
+
+    public function getChannels(Recipient $recipient): array
+    {
+        if (preg_match('{\b(great|awesome)\b}i', $this->comment->getText())) {
+            return ['email', 'chat/slack'];
+        }
+
+        $this->importance(Notification::IMPORTANCE_LOW);
+
+        return ['email'];
+    }
 }

لقد غيرنا أيضًا أهمية التعليقات "regular" نظرًا لأنه يغير قليلاً من تصميم البريد الإلكتروني.

وانتهى إرسال تعليق مع "awesome" في النص ، يجب أن تتلقى رسالة على Slack

بالنسبة للبريد الإلكتروني ، يمكنك تطبيق ChatNotificationInterface لتجاوز العرض الافتراضي لرسالة Slack:

patch_file
 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
--- a/src/Notification/CommentReviewNotification.php
+++ b/src/Notification/CommentReviewNotification.php
@@ -3,12 +3,17 @@
 namespace App\Notification;

 use App\Entity\Comment;
+use Symfony\Component\Notifier\Bridge\Slack\Block\SlackDividerBlock;
+use Symfony\Component\Notifier\Bridge\Slack\Block\SlackSectionBlock;
+use Symfony\Component\Notifier\Bridge\Slack\SlackOptions;
+use Symfony\Component\Notifier\Message\ChatMessage;
 use Symfony\Component\Notifier\Message\EmailMessage;
+use Symfony\Component\Notifier\Notification\ChatNotificationInterface;
 use Symfony\Component\Notifier\Notification\EmailNotificationInterface;
 use Symfony\Component\Notifier\Notification\Notification;
 use Symfony\Component\Notifier\Recipient\Recipient;

-class CommentReviewNotification extends Notification implements EmailNotificationInterface
+class CommentReviewNotification extends Notification implements EmailNotificationInterface, ChatNotificationInterface
 {
     private $comment;

@@ -30,6 +35,28 @@ class CommentReviewNotification extends Notification implements EmailNotificatio
         return $message;
     }

+    public function asChatMessage(Recipient $recipient, string $transport = null): ?ChatMessage
+    {
+        if ('slack' !== $transport) {
+            return null;
+        }
+
+        $message = ChatMessage::fromNotification($this, $recipient, $transport);
+        $message->subject($this->getSubject());
+        $message->options((new SlackOptions())
+            ->iconEmoji('tada')
+            ->iconUrl('https://guestbook.example.com')
+            ->username('Guestbook')
+            ->block((new SlackSectionBlock())->text($this->getSubject()))
+            ->block(new SlackDividerBlock())
+            ->block((new SlackSectionBlock())
+                ->text(sprintf('%s (%s) says: %s', $this->comment->getAuthor(), $this->comment->getEmail(), $this->comment->getText()))
+            )
+        );
+
+        return $message;
+    }
+
     public function getChannels(Recipient $recipient): array
     {
         if (preg_match('{\b(great|awesome)\b}i', $this->comment->getText())) {

إنه أفضل ، ولكن دعنا نذهب خطوة أخرى إلى الأمام. ألن يكون رائعًا أن تكون قادرًا على قبول أو رفض تعليق مباشرةً من سلاك؟

غيّر الإشعار لقبول عنوان URL الخاص بالمراجعة وأضف زرين في رسالة Slack:

patch_file
 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
--- a/src/Notification/CommentReviewNotification.php
+++ b/src/Notification/CommentReviewNotification.php
@@ -3,6 +3,7 @@
 namespace App\Notification;

 use App\Entity\Comment;
+use Symfony\Component\Notifier\Bridge\Slack\Block\SlackActionsBlock;
 use Symfony\Component\Notifier\Bridge\Slack\Block\SlackDividerBlock;
 use Symfony\Component\Notifier\Bridge\Slack\Block\SlackSectionBlock;
 use Symfony\Component\Notifier\Bridge\Slack\SlackOptions;
@@ -16,10 +17,12 @@ use Symfony\Component\Notifier\Recipient\Recipient;
 class CommentReviewNotification extends Notification implements EmailNotificationInterface, ChatNotificationInterface
 {
     private $comment;
+    private $reviewUrl;

-    public function __construct(Comment $comment)
+    public function __construct(Comment $comment, string $reviewUrl)
     {
         $this->comment = $comment;
+        $this->reviewUrl = $reviewUrl;

         parent::__construct('New comment posted');
     }
@@ -52,6 +55,10 @@ class CommentReviewNotification extends Notification implements EmailNotificatio
             ->block((new SlackSectionBlock())
                 ->text(sprintf('%s (%s) says: %s', $this->comment->getAuthor(), $this->comment->getEmail(), $this->comment->getText()))
             )
+            ->block((new SlackActionsBlock())
+                ->button('Accept', $this->reviewUrl, 'primary')
+                ->button('Reject', $this->reviewUrl.'?reject=1', 'danger')
+            )
         );

     return $message;

إنها الآن مسألة تتبع التغييرات إلى الوراء. أولاً ، قم بتحديث معالج الرسالة لتمرير عنوان URL للمراجعة:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
--- a/src/MessageHandler/CommentMessageHandler.php
+++ b/src/MessageHandler/CommentMessageHandler.php
@@ -60,7 +60,8 @@ class CommentMessageHandler implements MessageHandlerInterface

             $this->bus->dispatch($message);
         } elseif ($this->workflow->can($comment, 'publish') || $this->workflow->can($comment, 'publish_ham')) {
-            $this->notifier->send(new CommentReviewNotification($comment), ...$this->notifier->getAdminRecipients());
+            $notification = new CommentReviewNotification($comment, $message->getReviewUrl());
+            $this->notifier->send($notification, ...$this->notifier->getAdminRecipients());
         } elseif ($this->workflow->can($comment, 'optimize')) {
             if ($comment->getPhotoFilename()) {
                 $this->imageOptimizer->resize($this->photoDir.'/'.$comment->getPhotoFilename());

كما ترى ، يجب أن يكون عنوان URL للمراجعة جزءًا من رسالة التعليق ، دعنا نضيفه الآن:

patch_file
 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
--- a/src/Message/CommentMessage.php
+++ b/src/Message/CommentMessage.php
@@ -5,14 +5,21 @@ namespace App\Message;
 class CommentMessage
 {
     private $id;
+    private $reviewUrl;
     private $context;

-    public function __construct(int $id, array $context = [])
+    public function __construct(int $id, string $reviewUrl, array $context = [])
     {
         $this->id = $id;
+        $this->reviewUrl = $reviewUrl;
         $this->context = $context;
     }

+    public function getReviewUrl(): string
+    {
+        return $this->reviewUrl;
+    }
+
     public function getId(): int
     {
         return $this->id;

أخيرًا ، قم بتحديث وحدات التحكم لإنشاء عنوان URL للمراجعة وتمريره في مُنشئ رسالة التعليقات:

patch_file
 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
--- a/src/Controller/AdminController.php
+++ b/src/Controller/AdminController.php
@@ -12,6 +12,7 @@ use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\KernelInterface;
 use Symfony\Component\Messenger\MessageBusInterface;
 use Symfony\Component\Routing\Annotation\Route;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Workflow\Registry;
 use Twig\Environment;

@@ -51,7 +52,8 @@ class AdminController extends AbstractController
         $this->entityManager->flush();

         if ($accepted) {
-            $this->bus->dispatch(new CommentMessage($comment->getId()));
+            $reviewUrl = $this->generateUrl('review_comment', ['id' => $comment->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
+            $this->bus->dispatch(new CommentMessage($comment->getId(), $reviewUrl));
         }

         return $this->render('admin/review.html.twig', [
--- a/src/Controller/ConferenceController.php
+++ b/src/Controller/ConferenceController.php
@@ -17,6 +17,7 @@ use Symfony\Component\Messenger\MessageBusInterface;
 use Symfony\Component\Notifier\Notification\Notification;
 use Symfony\Component\Notifier\NotifierInterface;
 use Symfony\Component\Routing\Annotation\Route;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Twig\Environment;

 class ConferenceController extends AbstractController
@@ -89,7 +90,8 @@ class 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->bus->dispatch(new CommentMessage($comment->getId(), $reviewUrl, $context));

             $notifier->send(new Notification('Thank you for the feedback; your comment will be posted after moderation.', ['browser']));

يعني فك الشفرة التغييرات في المزيد من الأماكن ، ولكنه يجعل من السهل الاختبار والسبب وإعادة الاستخدام.

حاول مرة أخرى ، يجب أن تكون الرسالة في حالة جيدة الآن:

../_images/slack-message.png

الذهاب غير متزامن في جميع المجالات

اسمحوا لي أن أشرح مشكلة بسيطة يجب إصلاحها. لكل تعليق ، نتلقى رسالة بريد إلكتروني ورسالة سلاك. إذا كانت أخطاء رسالة Slack (معرف قناة خاطئ ، رمز خاطئ ، ...) ، فسيتم إعادة محاولة رسالة المرسِل ثلاث مرات قبل تجاهلها .ولكن مع إرسال البريد الإلكتروني أولاً ، سوف نتلقى 3 رسائل بريد إلكتروني ولا توجد رسائل سلاك. تتمثل إحدى طرق إصلاح ذلك في إرسال رسائل Slack بشكل غير متزامن مثل رسائل البريد الإلكتروني:

patch_file
1
2
3
4
5
6
7
8
--- a/config/packages/messenger.yaml
+++ b/config/packages/messenger.yaml
@@ -20,3 +20,5 @@ framework:
             # Route your messages to the transports
             App\Message\CommentMessage: async
             Symfony\Component\Mailer\Messenger\SendEmailMessage: async
+            Symfony\Component\Notifier\Message\ChatMessage: async
+            Symfony\Component\Notifier\Message\SmsMessage: async

بمجرد أن كل شيء غير متزامن ، تصبح الرسائل مستقلة. لقد مكّنا أيضًا رسائل SMS غير متزامنة في حالة رغبتك أيضًا في أن يتم إعلامك على هاتفك.

إخطار المستخدمين عن طريق البريد الإلكتروني

المهمة الأخيرة هي إخطار المستخدمين عند الموافقة على إرسالهم. ماذا عن السماح لك بتنفيذ ذلك بنفسك؟


  • « Previous خطوة 24: تشغيل المهمات الخلفية (Crons)
  • Next » خطوة 26: عرض API مع منصة (API Platform)

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.