सिम्फनी - सर्विस कंटेनर

किसी भी एप्लिकेशन में, एप्लिकेशन बढ़ने पर ऑब्जेक्ट बढ़ते हैं। जैसे-जैसे वस्तुएं बढ़ती हैं, वस्तुओं के बीच निर्भरता भी बढ़ती है। एक सफल अनुप्रयोग के लिए ऑब्जेक्ट निर्भरता को ठीक से संभालने की आवश्यकता है।

जैसा कि अवयव अध्याय में चर्चा की गई है, सिम्फनी एक आसान और कुशल घटक प्रदान करता है, DependencyInjectionवस्तु निर्भरता को संभालने के लिए। एक सेवा कंटेनर उन दोनों के बीच उचित रूप से हल की गई निर्भरता के साथ वस्तुओं का एक कंटेनर है। आइए इस अध्याय में डिपेंडेंसीइन्जेक्शन घटक का उपयोग करने का तरीका जानें।

आइये हम बनाते हैं Greeterकक्षा। अभिवादन वर्ग का उद्देश्य उपयोगकर्ता को अभिवादन करना है जैसा कि निम्नलिखित उदाहरण में दिखाया गया है।

$greeter = new Greeter('Hi'); 
$greeter->greet('Jon'); // print "Hi, Jon"

ग्रीट क्लास का पूरा कोड इस प्रकार है।

class Greeter { 
   private $greetingText; 
   
   public function __construct($greetingText) { 
      $this->greetingText = $greetingText; 
   }  
   public function greet($name) { 
      echo $this->greetingText . ", " . $name . "\r\n"; 
   } 
}

अब, हम ग्रीट क्लास को सर्विस कंटेनर में जोड़ते हैं। सिम्फनी प्रदान करता हैContainerBuilderएक नया कंटेनर बनाने के लिए। कंटेनर बनने के बाद, कंटेनर की रजिस्टर विधि का उपयोग करके ग्रीटेर क्लास को इसमें पंजीकृत किया जा सकता है।

use Symfony\Component\DependencyInjection\ContainerBuilder; 
$container = new ContainerBuilder(); 
$container 
   ->register('greeter', 'Greeter') 
   ->addArgument('Hi');

यहाँ, हमने नमस्कार पाठ को निर्दिष्ट करने के लिए स्थैतिक तर्क का उपयोग किया है, हाय। सिम्फनी पैरामीटर की एक गतिशील सेटिंग भी प्रदान करता है। डायनेमिक पैरामीटर का उपयोग करने के लिए, हमें एक नाम चुनना होगा और इसे% के बीच निर्दिष्ट करना होगा और कंटेनर के उपयोग से पैरामीटर सेट किया जा सकता हैsetParameter तरीका।

$container = new ContainerBuilder(); 
$container 
   ->register('greeter', 'Greeter') 
   ->addArgument('%greeter.text%');  
$container->setParameter('greeter.text', 'Hi');

हमने उचित सेटिंग के साथ एक ग्रीट क्लास रजिस्टर किया है। अब, हम कंटेनर को कंटेनर का उपयोग करके ठीक से कॉन्फ़िगर किए गए ग्रीट ऑब्जेक्ट प्रदान करने के लिए कह सकते हैंget तरीका।

$greeter = $container->get('greeter'); 
$greeter->greet('Jon'); // prints "Hi, Jon"

हमने सफलतापूर्वक एक वर्ग पंजीकृत किया है, कंटेनर में ग्रीट, इसे कंटेनर से लाया और इसका इस्तेमाल किया। अब, हम एक और क्लास बनाते हैंUser, जो ग्रीट क्लास का उपयोग करते हैं और देखते हैं कि इसे कैसे पंजीकृत किया जाए।

class User { 
   private $greeter;  
   public $name; 
   public $age;  
   
   public function setGreeter(\Greeter $greeter) { 
      $this->greeter = $greeter; 
   }  
   public function greet() { 
      $this->greeter->greet($this->name); 
   } 
}

उपयोगकर्ता वर्ग को अपनी सेटर विधि का उपयोग करके अभिवादक वर्ग मिलता है ,setGreeter। इस परिदृश्य के लिए, सिम्फनी एक विधि प्रदान करता है,addMethodCall और एक वर्ग, Reference निम्नलिखित कोड में दिखाए गए अनुसार एक अन्य वर्ग का उल्लेख करने के लिए।

use Symfony\Component\DependencyInjection\Reference;  
$container 
   ->register('user', 'User') 
   ->addMethodCall('setGreeter', array(new Reference('greeter')));

अंत में, हमने दो वर्गों को पंजीकृत किया है, Greeter तथा Userउनके बीच एक मजबूत रिश्ता है। अब, हम निम्नलिखित कोड में दिखाए गए अनुसार कंटेनर से ठीक से कॉन्फ़िगर किए गए ग्रीट वर्ग के साथ उपयोगकर्ता ऑब्जेक्ट को सुरक्षित रूप से प्राप्त कर सकते हैं।

$container->setParameter('greeter.text', 'Hi'); 
$user = $container->get('user'); 
$user->name = "Jon"; 
$user->age = 20; 
$user->greet(); // Prints "Hi, Jon"

हमने देखा है कि किसी वस्तु को केवल PHP का उपयोग करके कंटेनर में कैसे कॉन्फ़िगर किया जाए। सिम्फनी अन्य तंत्र भी प्रदान करता है। वे XML और YAML विन्यास फाइल हैं। आइए देखते हैं कि YAML का उपयोग करके कंटेनर को कैसे कॉन्फ़िगर किया जाए। इसके लिए, इंस्टॉल करेंsymfony/config तथा symfony/yaml घटकों के साथ symfony/dependency-injection अवयव।

cd /path/to/dir 
mkdir dependency-injection-example 
cd dependency-injection-example 
composer require symfony/dependency-injection 
composer require symfony/config 
composer require symfony/yaml

YAML कॉन्फ़िगरेशन एक अलग फ़ाइल में लिखा जाएगा, services.yml। YAML कॉन्फ़िगरेशन में दो खंड होते हैं,parameters तथा services। पैरामीटर अनुभाग सभी आवश्यक मापदंडों को परिभाषित करता है। सेवा अनुभाग सभी वस्तुओं को परिभाषित करता है। सेवा अनुभाग को और भी कई वर्गों में विभाजित किया गया है,class, arguments, तथा calls। वर्ग वास्तविक वर्ग को निर्दिष्ट करता है। तर्क निर्माता के तर्कों को निर्दिष्ट करता है। अंत में, कॉल सेटर विधियों को निर्दिष्ट करते हैं। एक अन्य वर्ग को @ प्रतीक, @ अभिवादक का उपयोग करके संदर्भित किया जा सकता है।

parameters: 
   greeter.text: 'Hello' 
services: 
   greeter: 
      class: Greeter
      arguments: ['%greeter.text%'] 
   user: 
      class: User 
      calls: 
         - [setGreeter, ['@greeter']]

अभी, services.yml का उपयोग कर लोड और कॉन्फ़िगर किया जा सकता है FileLoader तथा YamlFileLoader जैसा कि निम्नलिखित कोड में दिखाया गया है।

use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;  

$yamlContainer = new ContainerBuilder(); 
$loader = new YamlFileLoader($yamlContainer, new FileLocator(__DIR__)); 
$loader->load('services.yml');  

$yamlUser = $yamlContainer->get('user'); 
$yamlUser->name = "Jon"; 
$yamlUser->age = 25; 
$yamlUser->greet();

पूरी कोड सूची इस प्रकार है।

main.php

<?php  
   require __DIR__ . '/vendor/autoload.php';  
   use Symfony\Component\DependencyInjection\ContainerBuilder; 
   use Symfony\Component\Config\FileLocator; 
   use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
   use Symfony\Component\DependencyInjection\Reference;  
   
   class Greeter { 
      private $greetingText; 
      
      public function __construct($greetingText) {
         $this->greetingText = $greetingText; 
      }  
      public function greet($name) { 
         echo $this->greetingText . ", " . $name . "\r\n"; 
      } 
   }  
   class User { 
      private $greeter;  
      public $name; 
      public $age;  
      
      public function setGreeter(\Greeter $greeter) { 
         $this->greeter = $greeter; 
      }  
      public function greet() { 
         $this->greeter->greet($this->name); 
      } 
   }  
   $container = new ContainerBuilder(); 
   $container 
      ->register('greeter', 'Greeter') 
      ->addArgument('%greeter.text%');  
   $container 
      ->register('user', 'User') 
      ->addMethodCall('setGreeter', array(new Reference('greeter')));
   
   $container->setParameter('greeter.text', 'Hi'); 
   $greeter = $container->get('greeter'); 
   $greeter->greet('Jon'); 
   
   $user = $container->get('user'); 
   $user->name = "Jon"; 
   $user->age = 20; 
   $user->greet();  
   
   $yamlContainer = new ContainerBuilder(); 
   $loader = new YamlFileLoader($yamlContainer, new FileLocator(__DIR__)); 
   $loader->load('services.yml');  

   $yamlHello = $yamlContainer->get('greeter'); 
   $yamlHello->greet('Jon'); 
   
   $yamlUser = $yamlContainer->get('user'); 
   $yamlUser->name = "Jon"; 
   $yamlUser->age = 25; 
   $yamlUser->greet();  
?>

services.yml

parameters: 
   greeter.text: 'Hello' 
services: 
   greeter: 
      class: Greeter 
      arguments: ['%greeter.text%'] 
   user: 
      class: User 
      calls: 
         - [setGreeter, ['@greeter']]

सिम्फनी वेब फ्रेमवर्क निर्भरता इंजेक्शन घटक का बड़े पैमाने पर उपयोग करता है। सभी घटक केंद्रीकृत सेवा कंटेनर से बंधे हैं। सिम्फनी वेब फ्रेमवर्क अपने सभी में कंटेनर को उजागर करता हैController के माध्यम से containerसंपत्ति। हम इसके माध्यम से लॉगर, मेलर इत्यादि सभी वस्तुओं को इसमें पंजीकृत करवा सकते हैं।

$logger = $this->container->get('logger'); 
$logger->info('Hi');

कंटेनर में पंजीकृत ऑब्जेक्ट को खोजने के लिए, निम्न कमांड का उपयोग करें।

cd /path/to/app 
php bin/console debug:container

में लगभग 200+ ऑब्जेक्ट हैं hello स्थापना अध्याय में बनाया गया वेब ऐप।