logo

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - नया लेआउट बिल्डर अनुभव❗

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - स्टाइलिश, कस्टमाइज़ेबल ब्लॉक टाइप्स: स्लाइडशो, टैब्स, कार्ड्स, एकॉर्डियन्स और कई अन्य। बैकग्राउंड, DOM बॉक्स, जावास्क्रिप्ट प्लगइन्स के लिए बिल्ट-इन सेटिंग्स। आज ही लेआउट बिल्डिंग का भविष्य अनुभव करें।

डेमो EBT मॉड्यूल्स EBT मॉड्यूल्स डाउनलोड करें

❗एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - नया पैराग्राफ्स अनुभव

एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - एनालॉजिकल पैराग्राफ आधारित मॉड्यूल्स का सेट।

डेमो EPT मॉड्यूल्स EPT मॉड्यूल्स डाउनलोड करें

स्क्रॉल

ईवेंट सब्सक्राइबर और ईवेंट डिस्पैचर। Drupal में ईवेंट सिस्टम।

03/10/2025, by Ivan

Menu

इवेंट सिस्टम का अवलोकन

इवेंट सिस्टम का उपयोग कई जटिल एप्लिकेशनों में किया जाता है ताकि एक्सटेंशन्स को सिस्टम के कामकाज को बदलने की अनुमति दी जा सके। इवेंट सिस्टम को विभिन्न तरीकों से लागू किया जा सकता है, लेकिन सामान्य तौर पर अवधारणाएँ और घटक समान होते हैं।

  • इवेंट सब्सक्राइबर्स (Event Subscribers) – जिन्हें कभी-कभी "लिस्नर्स" भी कहा जाता है, ये कॉल होने वाली मेथड्स या फ़ंक्शन्स होते हैं, जो किसी इवेंट पर प्रतिक्रिया देते हैं जिसे पूरे इवेंट रजिस्ट्री में प्रसारित किया जाता है।
  • इवेंट रजिस्ट्री (Event Registry) – जहां इवेंट सब्सक्राइबर्स को इकट्ठा किया और क्रमबद्ध किया जाता है।
  • इवेंट डिस्पैचर (Event Dispatcher) – वह मैकेनिज्म जिसके द्वारा कोई इवेंट इनिशिएट या पूरे सिस्टम में "डिस्पैच" किया जाता है।
  • इवेंट कॉन्टेक्स्ट (Event Context) – कई इवेंट्स के लिए एक विशेष डेटा सेट की आवश्यकता होती है, जो इवेंट सब्सक्राइबर्स के लिए महत्वपूर्ण है। यह केवल एक मान हो सकता है जो सब्सक्राइबर को पास किया जाता है, या एक जटिल क्लास, जिसमें संबंधित डेटा मौजूद हो।

Drupal हुक्स (Hooks)

अपने अस्तित्व के अधिकांश समय में, Drupal में "हुक्स" के माध्यम से एक बुनियादी इवेंट सिस्टम रहा है। आइए देखें कि "हुक्स" की अवधारणा इन 4 इवेंट सिस्टम घटकों में कैसे विभाजित होती है।

  • इवेंट सब्सक्राइबर्स – Drupal हुक्स को एक विशेष नाम वाली फ़ंक्शन परिभाषित करके सिस्टम में रजिस्टर किया जाता है। उदाहरण के लिए, यदि आप "hook_my_event_name" इवेंट को सब्सक्राइब करना चाहते हैं, तो आपको myprefix_my_event_name() नामक नई फ़ंक्शन परिभाषित करनी होगी, जहां "myprefix" आपके मॉड्यूल या थीम का नाम है।
  • इवेंट रजिस्ट्री – Drupal हुक्स को "cache_boostrap" बकेट में "module_implements" आइडेंटिफायर के तहत संग्रहीत किया जाता है। यह केवल एक ऐरे है जिसमें उन मॉड्यूल्स की सूची होती है जो दिए गए हुक को लागू करते हैं।
  • इवेंट डिस्पैचर – Drupal 7 और Drupal 8 में हुक्स को अलग-अलग तरीकों से डिस्पैच किया जाता है:

1) Drupal 7: हुक्स को module_invoke_all() फ़ंक्शन से डिस्पैच किया जाता है।
2) Drupal 8: हुक्स को \Drupal::moduleHandler()->invokeAll() सर्विस मेथड से डिस्पैच किया जाता है।

  • इवेंट कॉन्टेक्स्ट – कॉन्टेक्स्ट को सब्सक्राइबर को पैरामीटर्स के रूप में पास किया जाता है। उदाहरण के लिए:

1) Drupal 7: module_invoke_all('my_event_name', $some_arbitrary_parameter);
2) Drupal 8: \Drupal::moduleHandler()->invokeAll('my_event_name', [$some_arbitrary_parameter]);

हुक्स के दृष्टिकोण की कुछ कमियाँ:

  • इवेंट्स केवल कैश रीबिल्ड के दौरान रजिस्टर होते हैं।

Drupal केवल कैश बिल्डिंग के समय नए हुक्स खोजता है। इसका मतलब है कि यदि आप कोई नया हुक जोड़ना चाहते हैं, तो आपको कैश रीबिल्ड करना होगा।

  • प्रत्येक मॉड्यूल केवल एक बार किसी इवेंट पर प्रतिक्रिया दे सकता है।

क्योंकि हुक्स बहुत विशेष नाम वाली फ़ंक्शन्स के माध्यम से परिभाषित होते हैं, एक मॉड्यूल या थीम केवल एक ही इवेंट का एक इम्प्लीमेंटेशन रख सकता है।

  • इवेंट्स का क्रम आसानी से निर्धारित नहीं किया जा सकता।

Drupal मॉड्यूल्स के "वेट" के आधार पर इवेंट्स का क्रम निर्धारित करता है। इसे बदलने के लिए Drupal 7 में "hook_module_implements_alter" जोड़ा गया।

Drupal 8 में Symfony आधारित नया इवेंट सिस्टम है, जो बेहतर है। हालांकि Drupal 8 कोर में अधिक इवेंट्स डिस्पैच नहीं होते, कई मॉड्यूल्स इस सिस्टम का उपयोग करने लगे हैं।

Drupal 8 इवेंट्स

Drupal 8 के इवेंट्स Symfony इवेंट्स से मिलते-जुलते हैं। आइए देखें कि ये हमारे चार घटकों से कैसे मेल खाते हैं।

  • इवेंट सब्सक्राइबर्स – \Symfony\Component\EventDispatcher\EventSubscriberInterface को लागू करने वाली क्लास।
  • इवेंट डिस्पैचर – \Symfony\Component\EventDispatcher\EventDispatcherInterface को लागू करने वाली क्लास।
  • इवेंट रजिस्ट्री – इवेंट सब्सक्राइबर्स को इवेंट डिस्पैचर ऑब्जेक्ट में रजिस्टर्ड किया जाता है।
  • इवेंट कॉन्टेक्स्ट – \Symfony\Component\EventDispatcher\Event को एक्सटेंड करने वाली क्लास।

Drupal 8 इवेंट्स का उपयोग करना सीखने से आप कस्टम मॉड्यूल डेवलपमेंट को बेहतर समझ पाएंगे।

मेरा पहला Drupal 8 इवेंट सब्सक्राइबर

आइए एक सब्सक्राइबर बनाएं जो Config ऑब्जेक्ट के सेव या डिलीट होने पर उपयोगकर्ता को मैसेज दिखाए।

name: Custom Events
type: module
description: Custom/Example event work.
core: 8.x
package: Custom

इसके बाद, हम custom_events.services.yml में सब्सक्राइबर को रजिस्टर करेंगे:

services:
  my_config_events_subscriber:
    class: '\Drupal\custom_events\EventSubscriber\ConfigEventsSubscriber'
    tags:
      - { name: 'event_subscriber' }

अब हमें ConfigEventsSubscriber क्लास लिखनी होगी। यह EventSubscriberInterface को लागू करेगी और getSubscribedEvents() मेथड परिभाषित करेगी।

namespace Drupal\custom_events\EventSubscriber;

use Drupal\Core\Config\ConfigCrudEvent;
use Drupal\Core\Config\ConfigEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ConfigEventsSubscriber implements EventSubscriberInterface {
  public static function getSubscribedEvents() {
    return [
      ConfigEvents::SAVE => 'configSave',
      ConfigEvents::DELETE => 'configDelete',
    ];
  }

  public function configSave(ConfigCrudEvent $event) {
    $config = $event->getConfig();
    \Drupal::messenger()->addStatus('Saved config: ' . $config->getName());
  }

  public function configDelete(ConfigCrudEvent $event) {
    $config = $event->getConfig();
    \Drupal::messenger()->addStatus('Deleted config: ' . $config->getName());
  }
}

अब जब भी कोई कॉन्फ़िग सेव या डिलीट होगा, मैसेज दिखाई देगा।

इवेंट डिस्पैच करना

आइए अब "hook_user_login" के लिए एक कस्टम इवेंट बनाएं और डिस्पैच करें।

namespace Drupal\custom_events\Event;

use Drupal\user\UserInterface;
use Symfony\Component\EventDispatcher\Event;

class UserLoginEvent extends Event {
  const EVENT_NAME = 'custom_events_user_login';
  public $account;

  public function __construct(UserInterface $account) {
    $this->account = $account;
  }
}

अब इसे hook_user_login में डिस्पैच करें:

function custom_events_user_login($account) {
  $event = new UserLoginEvent($account);
  $event_dispatcher = \Drupal::service('event_dispatcher');
  $event_dispatcher->dispatch(UserLoginEvent::EVENT_NAME, $event);
}

अब जब भी कोई यूज़र लॉगिन करेगा, इवेंट डिस्पैच होगा।

इवेंट सब्सक्राइबर का प्रायोरिटी

Drupal 8 इवेंट सिस्टम में आप सब्सक्राइबर का प्रायोरिटी सेट कर सकते हैं। उच्च प्रायोरिटी वाले पहले चलेंगे और कम प्रायोरिटी वाले बाद में।

public static function getSubscribedEvents() {
  return [
    ConfigEvents::SAVE => ['configSave', 100],
    ConfigEvents::DELETE => ['configDelete', -100],
  ];
}

इससे configSave पहले और configDelete बाद में चलेगा।

संदर्भ: