डिपेंडेंसी इनवर्ज़न का व्यावहारिक उपयोग
डिपेंडेंसी इनवर्ज़न से अडैप्टर को कोर से जोड़ें।
डिपेंडेंसी इनवर्ज़न का व्यावहारिक उपयोग, CoddyKit पर PHP Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह PHP Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
उलटाव बनाम प्रविष्टि
लोग दो अलग-अलग विचारों को एक समझ लेते हैं। निर्भरता प्रविष्टि एक तकनीक है: सहायक वस्तुओं को स्वयं बनाने के बजाय उन्हें बाहर से देना। निर्भरता उलटाव (SOLID का D) एक सिद्धांत है: उच्च-स्तरीय नीति और निम्न-स्तरीय विवरण दोनों अमूर्तन पर निर्भर हों और अमूर्तन का स्वामित्व उच्च-स्तरीय मॉड्यूल के पास हो। यह पाठ दूसरे विचार को वास्तविक बनाने के बारे में है — ठोस अडैप्टरों को उस कोर से जोड़ना जो इंटरफ़ेस परिभाषित करता है।
सिद्धांत, सटीक रूप में
निर्भरता उलटाव सिद्धांत कहता है:
- उच्च-स्तरीय मॉड्यूल को निम्न-स्तरीय मॉड्यूल पर निर्भर नहीं होना चाहिए। दोनों अमूर्तनों पर निर्भर हों।
- अमूर्तनों को विवरणों पर निर्भर नहीं होना चाहिए। विवरण अमूर्तनों पर निर्भर हों।
सूक्ष्म बात यह है: इंटरफ़ेस का स्वामित्व उपभोक्ता के पास होता है, कार्यान्वयक के पास नहीं। आपका डोमेन PaymentGateway घोषित करता है; स्ट्राइप अडैप्टर उसके अनुरूप होता है — इसका उलटा नहीं।
कोर में अमूर्तन परिभाषित करें
इंटरफ़ेस को उस कोड के पास रखें जिसे उसकी आवश्यकता है और उसे डोमेन की भाषा में व्यक्त करें। स्ट्राइप के प्रकार बाहर नहीं आने चाहिए।
<?php
// src/Billing/Application/Port/PaymentGateway.php
interface PaymentGateway
{
public function charge(Money $amount, CardToken $token): ChargeId;
}
final class Money {
public function __construct(public readonly int $cents, public readonly string $currency) {}
}
final class CardToken { public function __construct(public readonly string $value) {} }
final class ChargeId { public function __construct(public readonly string $value) {} }अडैप्टर को उसके अनुरूप बनाएँ
आधारभूत संरचना का अडैप्टर कोर के इंटरफ़ेस को लागू करता है और विक्रेता SDK में अनुवाद करता है। निर्भरता का तीर अडैप्टर (विवरण) से अमूर्तन (नीति) की ओर होता है — उलटाव पूरा हुआ।
<?php
final class StripePaymentGateway implements PaymentGateway
{
public function __construct(private \Stripe\StripeClient $stripe) {}
public function charge(Money $amount, CardToken $token): ChargeId {
$intent = $this->stripe->paymentIntents->create([
'amount' => $amount->cents,
'currency' => strtolower($amount->currency),
'payment_method' => $token->value,
'confirm' => true,
]);
return new ChargeId($intent->id);
}
}निर्माता के माध्यम से निर्भरता देना मानक है
निर्भरता निर्माता के माध्यम से दें और अमूर्तन का प्रकार स्पष्ट करें। निर्भरताएँ स्पष्ट, अपरिवर्तनीय और भूलना असंभव हो जाती हैं। आवश्यक सहायक वस्तुओं के लिए सेटर और गुण-प्रविष्टि से बचें — वे अधूरी बनी वस्तुओं की अनुमति देते हैं।
<?php
final class CheckoutService
{
public function __construct(
private PaymentGateway $payments, // abstraction, not StripeClient
private OrderRepository $orders,
) {}
public function pay(OrderId $id, CardToken $token): ChargeId {
$order = $this->orders->get($id);
$charge = $this->payments->charge($order->total(), $token);
$order->markPaid($charge);
$this->orders->save($order);
return $charge;
}
}संयोजन-केंद्र
सभी ठोस जोड़ाई ठीक एक जगह — संयोजन-केंद्र — में होती है, जो main()/प्रवेश-बिंदु के जितना संभव हो उतना निकट होता है। कोई अन्य स्थान आधारभूत संरचना को स्वयं नहीं बनाता। यही एक जगह है जो जानती है कि स्ट्राइप मौजूद है।
<?php
// public/index.php — composition root
$stripe = new \Stripe\StripeClient(getenv('STRIPE_SECRET'));
$gateway = new StripePaymentGateway($stripe);
$orders = new PdoOrderRepository(new PDO(getenv('DB_DSN')));
$checkout = new CheckoutService($gateway, $orders);
// Everything below depends only on abstractions
$controller = new CheckoutController($checkout);DI कंटेनर से जोड़ना
गैर-साधारण अनुप्रयोगों के लिए, एक कंटेनर (पीएचपी-डीआई, सिम्फनी) जोड़ाई को स्वचालित करता है। मुख्य कदम है इंटरफ़ेसों को कार्यान्वयनों से जोड़ना। स्वचालित जोड़ाई प्रकार के आधार पर निर्माताओं को हल करती है; आपको केवल इंटरफ़ेस→वर्ग मानचित्र घोषित करना होता है।
<?php
use function DI\autowire;
use function DI\get;
return [
PaymentGateway::class => autowire(StripePaymentGateway::class),
OrderRepository::class => autowire(PdoOrderRepository::class),
\Stripe\StripeClient::class => fn() => new \Stripe\StripeClient(getenv('STRIPE_SECRET')),
PDO::class => fn() => new PDO(getenv('DB_DSN')),
];अडैप्टर बदलने से बात सिद्ध होती है
क्योंकि कोर केवल PaymentGateway पर निर्भर करता है, प्रदाता बदलना या ऑफ़लाइन परीक्षण करना जोड़ाई में एक पंक्ति बदलने जितना सरल है। यहाँ एक इकाई परीक्षण में उपयोग किया गया नकली अडैप्टर है — CheckoutService अपरिवर्तित रहता है और कभी भी स्ट्राइप आयात नहीं करता।
<?php
final class FakeGateway implements PaymentGateway {
public array $charges = [];
public function charge(Money $a, CardToken $t): ChargeId {
$this->charges[] = $a;
return new ChargeId('ch_test_' . count($this->charges));
}
}
$fake = new FakeGateway();
$id = $fake->charge(new Money(2500, 'EUR'), new CardToken('tok_visa'));
echo $id->value, ' charges=', count($fake->charges), PHP_EOL; // ch_test_1 charges=1सेवा-खोजक के जाल से बचें
कंटेनर को स्वयं प्रविष्ट कराना और विधियों के भीतर से निर्भरताएँ निकालना सेवा-खोजक विरोधी-प्रतिरूप है। यह निर्भरताओं को छिपाता है, प्रकार-जाँच को निष्प्रभावी करता है और आपके कोड को फिर से कंटेनर से युग्मित कर देता है। जिन चीज़ों की आवश्यकता हो, उन्हें स्पष्ट रूप से प्रविष्ट कराएँ।
<?php
// ANTI-PATTERN: hidden dependencies, container leaks everywhere
final class BadCheckout {
public function __construct(private ContainerInterface $c) {}
public function pay($id, $token) {
$gateway = $this->c->get(PaymentGateway::class); // hidden!
// ...
}
}कंटेनर कहाँ दिखाई दे सकता है
कंटेनर केवल एक स्तर में उचित है: संयोजन-केंद्र और उसके चारों ओर मौजूद फ्रेमवर्क जोड़ाई (जैसे, नियंत्रक फ़ैक्टरी)। आपके डोमेन और अनुप्रयोग वर्ग कंटेनर-निरपेक्ष रहने चाहिए — वे निर्माताओं के माध्यम से साधारण वस्तुएँ प्राप्त करें और हाथ से बनाए जा सकें। एक अच्छी जाँच यह है: क्या आप बिना कंटेनर के एक ही PHP फ़ाइल में पूरे अनुप्रयोग को जोड़ सकते हैं? यदि हाँ, तो आपकी निर्भरताएँ ईमानदार हैं।
सेवा-खोज के बिना विलंबित जोड़ाई
कभी-कभी किसी निर्भरता को बनाना महँगा होता है या उसकी आवश्यकता केवल कुछ स्थितियों में होती है। कंटेनर प्रविष्ट कराने से बचें — इसके बजाय एक निर्माण-क्लोज़र प्रविष्ट कराएँ। निर्भरता स्पष्ट और प्रकार-सहित रहती है, जबकि उसका निर्माण वास्तव में उपयोग होने तक टल जाता है।
<?php
final class ReportService
{
/** @param Closure():PaymentGateway $gatewayFactory */
public function __construct(private Closure $gatewayFactory) {}
public function refundIfNeeded(bool $needed): void {
if (!$needed) return;
$gateway = ($this->gatewayFactory)(); // built only when required
// $gateway->charge(...) etc.
}
}
// Composition root supplies the factory, not the container
$svc = new ReportService(fn() => new StripePaymentGateway($stripe ?? null));
echo 'lazy dependency wired', PHP_EOL;त्वरित जाँच
PaymentGateway इंटरफ़ेस का स्वामी कौन होना चाहिए?
पुनरावलोकन
आपने अडैप्टरों को कोर से सही तरीके से जोड़ा:
- उलटाव ≠ प्रविष्टि: प्रविष्टि एक साधन है, जबकि उलटाव का अर्थ है अमूर्तन का स्वामित्व उपभोक्ता के पास होना।
- कोर इंटरफ़ेस परिभाषित करता है; आधारभूत संरचना के अडैप्टर उसके अनुरूप होते हैं।
- अमूर्तनों की निर्माता-आधारित प्रविष्टि का उपयोग करें; सभी ठोस जोड़ाई एक ही संयोजन-केंद्र में करें (या ऐसे कंटेनर विन्यास में जो इंटरफ़ेस→वर्ग से जोड़ता हो)।
- अडैप्टर बदलना और परीक्षणों में नकली अडैप्टर का उपयोग करना एक पंक्ति बदलने जितना सरल हो जाता है।
- सेवा-खोजक विरोधी-प्रतिरूप से बचें — कंटेनर को केवल किनारे पर रखें।
एआई शिक्षक के साथ PHP सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 49
- पाठ
- 195
अक्सर पूछे जाने वाले प्रश्न
क्या “डिपेंडेंसी इनवर्ज़न का व्यावहारिक उपयोग” पाठ निःशुल्क है?
हाँ—“डिपेंडेंसी इनवर्ज़न का व्यावहारिक उपयोग” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और PHP Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“डिपेंडेंसी इनवर्ज़न का व्यावहारिक उपयोग” में मैं क्या सीखूँगा?
डिपेंडेंसी इनवर्ज़न से अडैप्टर को कोर से जोड़ें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ PHP Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या PHP Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर PHP Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“डिपेंडेंसी इनवर्ज़न का व्यावहारिक उपयोग” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस PHP Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर PHP Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- लेयर्ड से क्लीन आर्किटेक्चर तक
- पोर्ट्स और अडैप्टर समझें
- यूज़ केस और एप्लिकेशन सर्विस
- डिपेंडेंसी इनवर्ज़न का व्यावहारिक उपयोग