Yii - निर्भरता इंजेक्शन

एक DI (निर्भरता इंजेक्शन) कंटेनर एक ऐसी वस्तु है जो वस्तुओं को त्वरित और कॉन्फ़िगर करना जानता है। Yii DI कंटेनर को इसके माध्यम से प्रदान करता हैyii\di\Container class

यह DI के निम्नलिखित प्रकारों का समर्थन करता है -

  • सेटर और संपत्ति इंजेक्शन
  • PHP कॉल करने योग्य इंजेक्शन
  • कंस्ट्रक्टर इंजेक्शन
  • नियंत्रक कार्रवाई इंजेक्शन

DI कंटेनर प्रकार संकेत की सहायता से कंस्ट्रक्टर इंजेक्शन का समर्थन करता है -

class Object1 {
   public function __construct(Object2 $object2) { } } $object1 = $container->get('Object1'); // which is equivalent to the following: $object2 = new Object2;
$object1 = new Object1($object2);

संपत्ति और सेटर इंजेक्शन विन्यास के माध्यम से समर्थित हैं -

<?php
   use yii\base\Object;
   class MyObject extends Object {
      public $var1; private $_var2;
      public function getVar2() {
         return $this->_var2; } public function setVar2(MyObject2 $var2) {
         $this->_var2 = $var2;
      }
   }
   $container->get('MyObject', [], [ 'var1' => $container->get('MyOtherObject'),
      'var2' => $container->get('MyObject2'),
   ]);
?>

PHP कॉल करने योग्य इंजेक्शन के मामले में, एक वर्ग के नए उदाहरणों को बनाने के लिए कंटेनर एक पंजीकृत PHP कॉलबैक का उपयोग करेगा -

$container->set('Object1', function () {
   $object1 = new Object1(new Object2); return $object1;
});
$object1 = $container->get('Object1');

नियंत्रक कार्रवाई इंजेक्शन एक प्रकार का DI है जहां निर्भरता को प्रकार के संकेत का उपयोग करके घोषित किया जाता है। यह MVC नियंत्रकों को हल्के वजन वाले और पतले रखने के लिए उपयोगी है -

public function actionSendToAdmin(EmailValidator $validator, $email) {
   if ($validator->validate($email)) {
      // sending email
   }
}

आप उपयोग कर सकते हैं yii\db\Container::set() निर्भरता दर्ज करने की विधि -

<?php
   $container = new \yii\di\Container; // register a class name as is. This can be skipped. $container->set('yii\db\Connection');
   // register an alias name. You can use $container->get('MyObject') // to create an instance of Connection $container->set('MyObject', 'yii\db\Connection');
   // register an interface
   // When a class depends on the interface, the corresponding class
   // will be instantiated as the dependent object
   $container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer'); // register an alias name with class configuration // In this case, a "class" element is required to specify the class $container->set('db', [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld',
      'username' => 'vladimir',
      'password' => '12345',
      'charset' => 'utf8',
   ]);
   // register a class with configuration. The configuration
   // will be applied when the class is instantiated by get()
   $container->set('yii\db\Connection', [ 'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld', 'username' => 'vladimir', 'password' => '12345', 'charset' => 'utf8', ]); // register a PHP callable // The callable will be executed each time when $container->get('db') is called
   $container->set('db', function ($container, $params, $config) {
      return new \yii\db\Connection($config); }); // register a component instance // $container->get('pageCache') will return the same instance each time when it 
      //is called
   $container->set('pageCache', new FileCache);
?>

DI का उपयोग करना

Step 1 - अंदर components फ़ोल्डर नामक एक फ़ाइल बनाएँ MyInterface.php निम्नलिखित कोड के साथ।

<?php
   namespace app\components;
   interface MyInterface {
      public function test();
   }
?>

Step 2 - घटक फ़ोल्डर के अंदर, दो फाइलें बनाएं।

First.php -

<?php
   namespace app\components;
   use app\components\MyInterface;
   class First implements MyInterface {
      public function test() {
         echo "First class <br>";
      }
   }
?>

Second.php -

<?php
   app\components;
   use app\components\MyInterface;
      class Second implements MyInterface {
      public function test() {
         echo "Second class <br>";
      }
   }
?>

Step 3 - अब, एक जोड़ें actionTestInterface SiteController के लिए।

public function actionTestInterface() {
   $container = new \yii\di\Container();
   $container->set ("\app\components\MyInterface","\app\components\First"); $obj = $container->get("\app\components\MyInterface"); $obj->test(); // print "First class"
   $container->set ("\app\components\MyInterface","\app\components\Second"); $obj = $container->get("\app\components\MyInterface"); $obj->test(); // print "Second class"
}

Step 4 - पर जाएं http://localhost:8080/index.php?r=site/test-interface आपको निम्नलिखित देखना चाहिए।

यह दृष्टिकोण सुविधाजनक है क्योंकि हम कक्षाओं को एक स्थान पर सेट कर सकते हैं और अन्य कोड नई कक्षाओं का स्वचालित रूप से उपयोग करेंगे।