डोमेन इवेंट और डोमेन सर्विस
डोमेन इवेंट और सर्विस से व्यावसायिक तथ्यों को दर्ज करें।
डोमेन इवेंट और डोमेन सर्विस, CoddyKit पर PHP Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह PHP Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
व्यावसायिक तथ्यों को दर्ज करना
हर व्यवहार किसी एक इकाई के भीतर समा जाए, ऐसा आवश्यक नहीं है। क्षेत्रीय घटनाएँ ऐसे महत्वपूर्ण व्यावसायिक तथ्यों को दर्ज करती हैं, जो पहले ही घट चुके हैं (OrderPlaced), ताकि प्रणाली के अन्य भाग प्रतिक्रिया दे सकें। क्षेत्रीय सेवाएँ ऐसा क्षेत्रीय तर्क रखती हैं, जो स्वाभाविक रूप से किसी एक इकाई या मान-वस्तु से संबंधित नहीं होता। यह पाठ दिखाता है कि समुच्चयों को अनावश्यक रूप से बड़ा किए बिना ये दोनों आपके मॉडल को अभिव्यक्तिपूर्ण कैसे रखते हैं।
क्षेत्रीय घटना क्या है
क्षेत्रीय घटना क्षेत्र में घटित किसी बात का अपरिवर्तनीय अभिलेख है। इसका नाम सर्वव्यापी भाषा का उपयोग करते हुए भूतकाल में रखा जाता है: OrderPlaced, PaymentReceived, CustomerRelocated। इसमें उस तथ्य का वर्णन करने वाला आँकड़ा और उसके घटित होने का समय होता है। यह एक मान-वस्तु है: एक बार बनाई जाती है और फिर कभी बदली नहीं जाती।
<?php
final class OrderPlaced {
public function __construct(
public readonly string $orderId,
public readonly int $totalCents,
public readonly DateTimeImmutable $occurredOn = new DateTimeImmutable()
) {}
}
$e = new OrderPlaced('o1', 1300);
echo $e->orderId, ' @ ', $e->occurredOn->format('H:i'), PHP_EOL;
समुच्चय घटनाएँ दर्ज करते हैं
समुच्चय-मूल अपने व्यवहार के हिस्से के रूप में घटनाएँ दर्ज करता है, फिर उन्हें इस तरह उपलब्ध कराता है कि अनुप्रयोग परत लेन-देन के स्थायी होने के बाद उन्हें प्रेषित कर सके। समुच्चय स्वयं प्रेषण नहीं करता—वह केवल दर्ज करता है। इससे क्षेत्र आधारभूत संरचना संबंधी चिंताओं से मुक्त रहता है।
<?php
final class OrderPlaced {
public function __construct(public readonly string $orderId) {}
}
abstract class AggregateRoot {
private array $events = [];
protected function record(object $e): void { $this->events[] = $e; }
public function releaseEvents(): array {
$out = $this->events; $this->events = []; return $out;
}
}
final class Order extends AggregateRoot {
public function __construct(public readonly string $id) {
$this->record(new OrderPlaced($id));
}
}
$o = new Order('o1');
foreach ($o->releaseEvents() as $e) { echo get_class($e), PHP_EOL; }
स्थायीकरण के बाद प्रेषण
अनुप्रयोग सेवा समुच्चय को स्थायी रूप से सहेजती है, लेन-देन को स्थायी करती है, फिर जारी की गई घटनाओं को प्रेषित करती है। स्थायीकरण के बाद प्रेषण यह सुनिश्चित करता है कि संचालक कभी ऐसे तथ्य पर प्रतिक्रिया न दें, जिसे वापस ले लिया गया हो। नीचे दिया गया क्रम ईमेल या बाहरी आह्वान जैसे दुष्प्रभावों के लिए सुरक्षित नमूना है।
<?php
final class PlaceOrderService {
public function __construct(
private object $repo,
private object $dispatcher
) {}
public function handle(object $order): void {
// 1. persist inside a transaction
$this->repo->save($order); // commit happens here
// 2. only AFTER commit, release and dispatch
foreach ($order->releaseEvents() as $event) {
$this->dispatcher->dispatch($event);
}
}
}
echo "order persisted, then events dispatched", PHP_EOL;
संचालक प्रतिक्रिया देते हैं
हर घटना के कई संचालक हो सकते हैं, जो उसे उत्पन्न करने वाले समुच्चय से स्वतंत्र होते हैं। PSR-14 प्रेषक घटना को पंजीकृत श्रोताओं तक पहुँचाता है। नई प्रतिक्रिया जोड़ने (विश्लेषण, सूचना) के लिए समुच्चय को छूने की आवश्यकता नहीं होती; केवल एक नया श्रोता जोड़ना होता है।
<?php
final class OrderPlaced { public function __construct(public readonly string $orderId) {} }
final class Dispatcher {
private array $listeners = [];
public function on(string $event, callable $l): void { $this->listeners[$event][] = $l; }
public function dispatch(object $event): void {
foreach ($this->listeners[$event::class] ?? [] as $l) { $l($event); }
}
}
$d = new Dispatcher();
$d->on(OrderPlaced::class, fn($e) => print("email for {$e->orderId}\n"));
$d->on(OrderPlaced::class, fn($e) => print("analytics for {$e->orderId}\n"));
$d->dispatch(new OrderPlaced('o1'));
सीमाओं के पार घटनाएँ
क्षेत्रीय घटनाएँ उन समुच्चयों को स्वतंत्र करती हैं, जिन्हें एक लेन-देन साझा किए बिना भी सुसंगत रहना होता है। बिक्री संदर्भ में OrderPlaced घटना किसी अन्य संदर्भ में घटना के माध्यम से भंडार आरक्षण शुरू कर सकती है। आंतरिक रूप से ये वस्तुएँ होती हैं; सेवाओं के बीच ये अक्सर संदेश-मध्यस्थ पर एकीकरण घटनाएँ बन जाती हैं। आंतरिक क्षेत्रीय घटनाओं और बाहरी एकीकरण घटनाओं को अलग रखिए—सार्वजनिक अनुबंध आपका आंतरिक मॉडल नहीं होना चाहिए।
क्षेत्रीय सेवा क्या है
क्षेत्रीय सेवा ऐसा क्षेत्रीय तर्क रखती है जो:
- कई समुच्चयों या इकाइयों से संबंधित हो, इसलिए उनमें से किसी एक में स्वाभाविक रूप से समा न सके, और
- सर्वव्यापी भाषा में व्यक्त किया गया वास्तविक क्षेत्रीय विचार हो।
यह स्थिति-विहीन होती है और क्षेत्रीय वस्तुओं पर काम करती है। एक खाते से धन घटाकर दूसरे खाते में जोड़ने वाली FundsTransfer सेवा इसका पारंपरिक उदाहरण है।
कोड में क्षेत्रीय सेवा
सेवा दो समुच्चयों का समन्वय करती है, लेकिन अपनी कोई स्थिति नहीं रखती। तर्क किसी एक खाते से संबंधित नहीं है, इसलिए वह क्षेत्रीय क्रिया के नाम पर बनी सेवा में रहता है।
<?php
final class Account {
public function __construct(public readonly string $id, private int $cents) {}
public function withdraw(int $c): void {
if ($c > $this->cents) { throw new DomainException('insufficient funds'); }
$this->cents -= $c;
}
public function deposit(int $c): void { $this->cents += $c; }
public function balance(): int { return $this->cents; }
}
final class MoneyTransferService {
public function transfer(Account $from, Account $to, int $cents): void {
$from->withdraw($cents);
$to->deposit($cents);
}
}
$a = new Account('a', 1000); $b = new Account('b', 0);
(new MoneyTransferService())->transfer($a, $b, 400);
echo $a->balance(), '/', $b->balance(), PHP_EOL; // 600/400
क्षेत्रीय सेवा और अनुप्रयोग सेवा
दोनों को गड्डमड्ड न करें:
- क्षेत्रीय सेवा व्यावसायिक तर्क रखती है और क्षेत्रीय परत में रहती है; उसे लेन-देन या अति-पाठ स्थानांतरण प्रोटोकॉल के बारे में कुछ पता नहीं होता।
- अनुप्रयोग सेवा किसी उपयोग-प्रकरण का समन्वय करती है: वह भंडारों से समुच्चय लाती है, क्षेत्रीय तर्क बुलाती है, लेन-देन को स्थायी करती है और घटनाएँ प्रेषित करती है। यह बिना अपने व्यावसायिक नियमों वाला पतला समन्वयक होती है।
सेवा-जाल से बचिए
क्षेत्रीय सेवाओं का अत्यधिक उपयोग करना आसान है। यदि तर्क किसी इकाई या मान-वस्तु पर रखा जा सकता है, तो उसे वहीं रखा जाना चाहिए: इसी तरह आप निर्बल मॉडल से बचते हैं। क्षेत्रीय सेवा का उपयोग तभी कीजिए, जब क्रिया वास्तव में कई समुच्चयों तक फैली हो या उसका कोई स्वाभाविक स्थान न हो। अन्यथा आप अपनी इकाइयों से व्यवहार निकाल देंगे और प्रक्रियात्मक कोड फिर से बना देंगे।
एप्लिकेशन सेवा समन्वय करती है
अब इसे एक साथ देखें: एक पतली एप्लिकेशन सेवा रिपॉज़िटरीज़ से एग्रीगेट्स लोड करती है, एकाधिक एग्रीगेट्स से संबंधित तर्क के लिए डोमेन सेवा को बुलाती है, परिणाम को स्थायी रूप से सहेजती है और इवेंट्स भेजती है। इसमें केवल समन्वय होता है — इसके अपने कोई व्यावसायिक नियम नहीं होते।
<?php
final class Account {
public function __construct(public readonly string $id, public int $cents) {}
}
final class MoneyTransferService { // domain service: the rule
public function transfer(Account $from, Account $to, int $c): void {
if ($c > $from->cents) { throw new DomainException('insufficient'); }
$from->cents -= $c; $to->cents += $c;
}
}
final class TransferApp { // application service: orchestration only
public function __construct(private MoneyTransferService $domain) {}
public function run(Account $a, Account $b, int $c): void {
$this->domain->transfer($a, $b, $c); // then repo->save + dispatch
}
}
$a = new Account('a', 1000); $b = new Account('b', 0);
(new TransferApp(new MoneyTransferService()))->run($a, $b, 250);
echo $a->cents, '/', $b->cents, PHP_EOL; // 750/250
त्वरित जाँच
इवेंट्स और सेवाएँ
पुनरावलोकन
आपने व्यावसायिक तथ्यों और किसी एक स्थान से जुड़े न रहने वाले तर्क को अलग पहचाना। डोमेन इवेंट्स अपरिवर्तनीय, भूतकाल में दर्ज किए गए रिकॉर्ड होते हैं, जिन्हें एग्रीगेट्स दर्ज करते हैं और एप्लिकेशन परत कमिट के बाद भेजती है। इससे प्रतिक्रियाएँ एक-दूसरे से अलग रहती हैं और एग्रीगेट की सीमाएँ पार की जा सकती हैं। डोमेन सेवाएँ कई एग्रीगेट्स में फैले स्टेट-रहित डोमेन तर्क को रखती हैं। ये उन पतली एप्लिकेशन सेवाओं से अलग होती हैं, जो केवल उपयोग-प्रकरणों का समन्वय करती हैं। दोनों का सीमित उपयोग करें, ताकि व्यवहार वहीं एंटिटीज़ और वैल्यू ऑब्जेक्ट्स में रहे जहाँ उसका होना उचित है।
एआई शिक्षक के साथ PHP सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 49
- पाठ
- 195
अक्सर पूछे जाने वाले प्रश्न
क्या “डोमेन इवेंट और डोमेन सर्विस” पाठ निःशुल्क है?
हाँ—“डोमेन इवेंट और डोमेन सर्विस” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और PHP Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“डोमेन इवेंट और डोमेन सर्विस” में मैं क्या सीखूँगा?
डोमेन इवेंट और सर्विस से व्यावसायिक तथ्यों को दर्ज करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ PHP Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या PHP Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर PHP Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“डोमेन इवेंट और डोमेन सर्विस” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस PHP Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर PHP Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- DDD के आधारभूत घटक: एंटिटी और वैल्यू ऑब्जेक्ट
- एग्रीगेट, रिपॉज़िटरी और फ़ैक्टरी
- डोमेन इवेंट और डोमेन सर्विस
- बाउंडेड कॉन्टेक्स्ट और कॉन्टेक्स्ट मैपिंग