Sébastien TIMONER
वेब विकास और तकनीकी टीम प्रबंधन में विशेषज्ञ, मैं प्रभावी डिजिटल समाधानों के निर्माण और अनुकूलन में विशेषज्ञता रखता हूं। React.js, Node.js, TypeScript, Symfony, Docker और FrankenPHP जैसी आधुनिक तकनीकों की गहरी समझ के साथ, मैं विभिन्न क्षेत्रों की कंपनियों के लिए जटिल SaaS परियोजनाओं की सफलता सुनिश्चित करता हूं, डिजाइन से लेकर प्रोडक्शन तक।
हर जगह CQRS का ज़िक्र सुनते-सुनते थक गए हैं लेकिन सोचते हैं कि Symfony या Laravel उठाए बिना इसे कैसे लागू करें? अच्छी खबर यह है कि हम सिर्फ वनीला PHP में Command Query Responsibility Segregation को देख सकते हैं। ज़रूरत बस एक साफ-सुथरी संरचना और कुछ सोची-समझी क्लास की है। अपना एडिटर खोलिए, हम मिलकर नींव तैयार करते हैं।
यदि आपको पुराने वर्ज़न पर रहना है तो सुनिश्चित करें कि यहाँ इस्तेमाल की गई सुविधाएँ (कंस्ट्रक्टर प्रमोशन, प्रॉपर्टी आदि) उपलब्ध हों, या फिर स्निपेट्स को उसी अनुसार समायोजित करें।
CQRS का मतलब है रीड (Query) और राइट (Command) को अलग करना। इससे दो अनुकूलित मार्ग तैयार होते हैं:
यह विभाजन DDD की सोच से आता है, लेकिन बिना भारी-भरकम औपचारिकता के भी अपनाया जा सकता है। तुरंत मिलने वाले फायदे:
ध्यान रखें कि CQRS कुछ अतिरिक्त संरचनात्मक जटिलता लाता है। साधारण CRUD के लिए यह ज़रूरत से ज़्यादा हो सकता है। तब ही अपनाएँ जब बिज़नेस नियम या स्केलेबिलिटी की ज़रूरत इसे सही ठहराए।
एक साधारण पेड़-ढांचे से काम चल जाएगा:
यहाँ हम Domain (बिज़नेस नियम), Application (उपयोग केस) और Infrastructure (कंक्रीट इम्प्लीमेंटेशन) को साफ़ तौर पर अलग रखते हैं।
अब एग्रीगेट और उसका रिपॉज़िटरी बनाएँ:
कमांड इरादा लेकर आती है। हैंडलर बिज़नेस लॉजिक को व्यवस्थित करता है।
महत्वपूर्ण नोट: हैंडलर कुछ भी रिटर्न नहीं करता। लेख को दोबारा पढ़ना है तो Query का उपयोग करें।
हम ऐसा एरे लौटाते हैं जिसे सीधे सीरियलाइज़ किया जा सके, ताकि प्रेज़ेंटेशन लेयर डोमेन मॉडल पर निर्भर न हो।
बाद में चाहें तो Doctrine, PDO या किसी बाहरी API से इसे बदल सकते हैं—हैंडलरों को छुए बिना।
हैंडलर रिज़ॉल्यूशन को केंद्रीकृत करते ही CQRS का स्वाद आता है:
php
php
ये बस अभी साधारण हैं लेकिन अवधारणा समझने को पर्याप्त हैं। वास्तविक प्रोजेक्ट में इन्हें PHP-DI या Symfony DI जैसे डिपेंडेंसी इंजेक्शन कंटेनर से जोड़ सकते हैं।
public/index.php
में बूटस्ट्रैप उदाहरणphp
(...)
ऑपरेटर (first-class callable) PHP 8.1 से उपलब्ध है और PHP 8.4 में पूरी तरह समर्थित है। यदि आपको 8.0 या उससे नीचे को सपोर्ट करना है, तो इसे fn ($command) => $createHandler($command)
से बदल दें।
जब नींव तैयार हो जाए तो समाधान को आगे बढ़ाएँ:
ArticlePublished
इवेंट निकालें और दूसरे लेयर में हैंडल करें।इस ढाँचे के साथ आप मौजूदा प्रोजेक्ट में धीरे-धीरे CQRS शामिल कर सकते हैं या बिना किसी फ्रेमवर्क के नया सर्विस शुरू कर सकते हैं। बस रीड और राइट की सीमा को स्पष्ट रखें और आर्किटेक्चर को चरण दर चरण विकसित करते रहें। सुखद प्रयोग की शुभकामनाएँ!
php -v
readonly
php -S 127.0.0.1:8000 -t public
readonly
src/
Domain/
Article.php
ArticleRepository.php
Application/
Command/
CreateArticle/
CreateArticleCommand.php
CreateArticleHandler.php
Query/
ListArticles/
ListArticlesQuery.php
ListArticlesHandler.php
Bus/
CommandBus.php
QueryBus.php
Infrastructure/
InMemoryArticleRepository.php
public/
index.php
Article
php
php
php
php
php
php
php