12.15.1. Կախվածության ներարկում կառավարիչում
Նախորդ հոդվածում մենք դիտարկեցինք՝ ինչ է Dependency Injection-ը․
12.15. Սերվիսներ և Dependency Injection։
Այս հոդվածում ներկայացված է Dependency Injection-ի օրինակ՝ Controller-ում։
/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;
}
}
Եկեք վերլուծենք 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-ին ճիշտ ցույց տալ օբյեկտի մեթոդները autocomplete-ում։
/**
* 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-ից ստացվող օբյեկտների համար օգտագործվում է փոքրատառ ($form_builder), իսկ դասում դրանց պահման համար՝ camelCase (formBuilder)։
Այժմ կարող ենք օգտագործել այդ օբյեկտը դասի մեթոդների մեջ՝
/**
* Callback for modal form.
*/
public function openModalForm() {
...
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
...
}