SymfonyWorld Online 2020
100% online
30+ talks + workshops
Live + Replay watch talks later

خطوة 12: الاستماع إلى الأحداث

5.0 version
Maintained

الاستماع إلى الأحداث

يفتقد التخطيط الحالي إلى رأس تنقل للعودة إلى الصفحة الرئيسية أو التبديل من مؤتمر إلى آخر.

إضافة رأس موقع header

يجب أن يكون أي شيء يجب عرضه على جميع صفحات الويب ، مثل الرأس ، جزءًا من التخطيط الأساسي الرئيسي:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
--- a/templates/base.html.twig
+++ b/templates/base.html.twig
@@ -6,6 +6,15 @@
         {% block stylesheets %}{% endblock %}
     </head>
     <body>
+        <header>
+            <h1><a href="{{ path('homepage') }}">Guestbook</a></h1>
+            <ul>
+            {% for conference in conferences %}
+                <li><a href="{{ path('conference', { id: conference.id }) }}">{{ conference }}</a></li>
+            {% endfor %}
+            </ul>
+            <hr />
+        </header>
         {% block body %}{% endblock %}
         {% block javascripts %}{% endblock %}
     </body>

إن إضافة هذا الكود إلى التخطيط يعني أن جميع القوالب التي توسعه يجب أن تحدد متغير المؤتمرات، الذي يجب إنشاؤه وتمريره من وحدات التحكم الخاصة بهم.

نظرًا لأن لدينا وحدتي تحكم فقط ، يمكنك القيام بما يلي:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
--- a/src/Controller/ConferenceController.php
+++ b/src/Controller/ConferenceController.php
@@ -32,9 +32,10 @@ class ConferenceController extends AbstractController
     /**
      * @Route("/conference/{slug}", name="conference")
      */
-    public function show(Conference $conference, CommentRepository $commentRepository)
+    public function show(Conference $conference, CommentRepository $commentRepository, ConferenceRepository $conferenceRepository)
     {
         return new Response($this->twig->render('conference/show.html.twig', [
+            'conferences' => $conferenceRepository->findAll(),
             'conference' => $conference,
             'comments' => $commentRepository->findBy(['conference' => $conference], ['createdAt' => 'DESC']),
         ]));

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

لدى Twig مفهوم المتغيرات العالمية. * متغير عام * متاح في جميع النماذج المقدمة. يمكنك تحديدها في ملف تكوين ، ولكنها تعمل فقط للقيم الثابتة. لإضافة جميع المؤتمرات كمتغير عالمي Twig ، سنقوم بإنشاء مستمع.

اكتشاف أحداث سيمفوني Symfony Events

يأتي سيمفوني مدمجًا مع مكون مرسل الأحداث (Event Dispatcher Component). يقوم المرسل * بإرسال * أحداث معينة * في أوقات محددة يمكن * للمستمعين * الاستماع إليها. المستمعون هم خطافات في الإطار الداخلي.

على سبيل المثال ، تسمح لك بعض الأحداث بالتفاعل مع دورة حياة طلبات HTTP. أثناء معالجة الطلب ، يرسل المرسل الأحداث عند إنشاء الطلب ، أو عندما تكون وحدة التحكم على وشك التنفيذ ، أو عندما تكون الاستجابة جاهزة للإرسال ، أو عندما يتم طرح استثناء. يمكن * المستمع * الاستماع إلى حدث واحد أو أكثر وتنفيذ بعض المنطق بناءً على سياق الحدث.

الأحداث عبارة عن نقاط امتداد محددة جيدًا تجعل الإطار أكثر شمولاً وقابلية للتوسيع. تستخدم العديد من مكونات سيمفوني مثل Security أو Messenger أو Workflow أو Mailer على نطاق واسع.

مثال آخر مضمن للأحداث والمستمعين قيد التنفيذ هو دورة حياة الأمر: يمكنك إنشاء مستمع لتنفيذ التعليمات البرمجية قبل تشغيل أي أمر.

يمكن لأي حزمة أو حزمة أيضًا إرسال أحداثها الخاصة لجعل رمزها قابلاً للتوسيع.

لتجنب وجود ملف تكوين يصف الأحداث التي يرغب المستمع في الاستماع إليها ، قم بإنشاء مشترك. المشترك هو مستمع بأسلوب ثابت `` getSubscribeEvents () `` يعيد تكوينه. هذا يسمح للمشتركين بالتسجيل في مرسل سيمفوني تلقائيًا.

إنجاز مشترك Subscriber

أنت تعرف الأغنية عن ظهر قلب الآن ، استخدم حزمة صانع لإنشاء مشترك Subscriber:

1
$ symfony console make:subscriber TwigEventSubscriber

يسألك الأمر عن الحدث الذي تريد الاستماع إليه. اختر حدث `` Symfony Component HttpKernel Event ControllerEvent `` ، الذي يتم إرساله قبل استدعاء وحدة التحكم. هذا هو أفضل وقت لحقن المتغير العالمي `` للمؤتمرات '' حتى يتمكن Twig من الوصول إليه عندما تقوم وحدة التحكم بتقديم القالب. قم بتحديث المشترك كما يلي:

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
--- a/src/EventSubscriber/TwigEventSubscriber.php
+++ b/src/EventSubscriber/TwigEventSubscriber.php
@@ -2,14 +2,25 @@

 namespace App\EventSubscriber;

+use App\Repository\ConferenceRepository;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\ControllerEvent;
+use Twig\Environment;

 class TwigEventSubscriber implements EventSubscriberInterface
 {
+    private $twig;
+    private $conferenceRepository;
+
+    public function __construct(Environment $twig, ConferenceRepository $conferenceRepository)
+    {
+        $this->twig = $twig;
+        $this->conferenceRepository = $conferenceRepository;
+    }
+
     public function onControllerEvent(ControllerEvent $event)
     {
-        // ...
+        $this->twig->addGlobal('conferences', $this->conferenceRepository->findAll());
     }

     public static function getSubscribedEvents()

الآن ، يمكنك إضافة أي عدد تريده من وحدات التحكم: سيكون متغير متغيرات `` المؤتمرات `` متاحًا دائمًا في Twig.

Note

سوف نتحدث عن أداء بديل أفضل بكثير في خطوة لاحقة.

فرز المؤتمرات حسب السنة والمدينة

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

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
--- a/src/Repository/ConferenceRepository.php
+++ b/src/Repository/ConferenceRepository.php
@@ -19,6 +19,11 @@ class ConferenceRepository extends ServiceEntityRepository
         parent::__construct($registry, Conference::class);
     }

+    public function findAll()
+    {
+        return $this->findBy([], ['year' => 'ASC', 'city' => 'ASC']);
+    }
+
     // /**
     //  * @return Conference[] Returns an array of Conference objects
     //  */

في نهاية هذه الخطوة ، يجب أن يبدو موقع الويب كما يلي:


  • « Previous خطوة 11: تفرع الكود
  • Next » خطوة 13: إدارة دورة حياة Doctrine Objects

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