12.15.1. कंट्रोलर में Dependency Injection
पिछले लेख में हमने देखा कि Dependencies Injection क्या होता है:
12.15. Services और Dependency Injection
इस लेख में कंट्रोलर में Dependency Injection का कोड उदाहरण दिया गया है।
/modules/custom/drupalbook/src/Controller/ModalFormContactController.php:
<?php
namespace Drupal\drupalbook\Controller;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Form\FormBuilder;
/**
* ModalFormContactController class.
*/
class ModalFormContactController extends ControllerBase {
/**
* The form builder.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
/**
* ModalFormContactController constructor.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* The form builder.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* The Drupal service container.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
/**
* Callback for modal form.
*/
public function openModalForm() {
$response = new AjaxResponse();
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
$enquiry_title = $this->t("Send an enquiry to @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
$response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));
return $response;
}
}
आइए कोड के DI (Dependency Injection) वाले हिस्सों को समझते हैं।
namespace Drupal\drupalbook\Controller;
सबसे पहले हम namespace बताते हैं, यानी यह फाइल किस स्थान पर है, जहाँ drupalbook आपके मॉड्यूल का मशीन नाम है।
use Symfony\Component\DependencyInjection\ContainerInterface;
हम ContainerInterface क्लास को शामिल करते हैं, जिसे हम बाद में Service Container से ऑब्जेक्ट्स प्राप्त करने के लिए उपयोग करेंगे।
/**
* The form builder.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
हम एक प्रॉपर्टी घोषित करते हैं जिसमें Service Container से प्राप्त ऑब्जेक्ट सेव किया जाएगा। @var \Namespace कमेंट आपकी IDE को यह समझने में मदद करता है कि ऑटो-कंप्लीट में कौन से मेथड्स दिखाने हैं।
/**
* ModalFormContactController constructor.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* The form builder.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
इसके बाद कंस्ट्रक्टर में हम Service Container से ऑब्जेक्ट को पैरामीटर के रूप में लेते हैं। यह ऑब्जेक्ट हम अगले create() मेथड में बनाएँगे, और यहाँ उसे प्राप्त कर ऊपर घोषित प्रॉपर्टी $formBuilder में सेव करेंगे। अगर आप नया सर्विस जोड़ते हैं, तो आपको __construct() में पैरामीटर्स एक-एक करके जोड़ने होंगे। यानी अगर आपको 10 सर्विसेज़ चाहिए, तो आपके पास 10 पैरामीटर्स होंगे।
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* The Drupal service container.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
create() मेथड में हम Service Container ऑब्जेक्ट प्राप्त करते हैं और $form_builder ऑब्जेक्ट वापस करते हैं। ऊपर दिए गए कंस्ट्रक्टर में हम इसे प्रॉपर्टी (formBuilder) में सेव करते हैं। ध्यान दें कि Service Container से लिए गए पैरामीटर्स lowercase (जैसे $form_builder) होते हैं, जबकि क्लास की प्रॉपर्टीज़ camelCase (जैसे $formBuilder) होती हैं।
और अब हम अपने क्लास के मेथड्स में Service Container से ऑब्जेक्ट का उपयोग कर सकते हैं:
/**
* Callback for modal form.
*/
public function openModalForm() {
...
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
...
}