12.15.1. Dependency Injection u kontroleru
U prethodnom članku smo razmotrili šta je Dependency Injection:
12.15. Servisi i Dependency Injection.
U ovom članku dat je primer koda sa Dependency Injection u kontroleru.
/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 klasa.
*/
class ModalFormContactController extends ControllerBase {
/**
* Konstruktor forme.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
/**
* Konstruktor ModalFormContactController klase.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* Konstruktor forme.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* Drupal servisni kontejner.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
/**
* Povratni poziv za modalni formular.
*/
public function openModalForm() {
$response = new AjaxResponse();
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
$enquiry_title = $this->t("Pošaljite upit za @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
$response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));
return $response;
}
}
Hajde da razložimo delove koda za DI (Dependency Injection).
namespace Drupal\drupalbook\Controller;
Prvo navodimo namespace (prostor imena), mesto gde se ovaj fajl nalazi, gde je drupalbook mašinsko ime vašeg modula.
use Symfony\Component\DependencyInjection\ContainerInterface;
Uvozimo klasu ContainerInterface, koju ćemo kasnije koristiti za dobijanje objekata iz servisnog kontejnera.
/**
* Konstruktor forme.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
Deklarišemo svojstvo u kome ćemo čuvati objekat iz servisnog kontejnera. Komentar @var \Namespace pomaže vašem IDE-u da zna koje metode objekat ima i da ih predloži u automatskom dovršavanju.
/**
* Konstruktor ModalFormContactController klase.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* Konstruktor forme.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
Dalje, u konstruktoru treba da primimo u parametru objekat iz servisnog kontejnera, taj objekat ćemo praviti u sledećem metodu create(), a ovde ga dobijamo i čuvamo u prethodno deklarisano svojstvo $formBuilder. Ako povezujete novi servis, dodajte ga parametar po parametar u __construct(). Dakle, ako želite da povežete 10 servisa, imaćete 10 parametara.
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* Drupal servisni kontejner.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
U metodu create dobijamo objekat servisnog kontejnera i vraćamo objekat $form_builder, koji u konstruktoru čuvamo u svojstvu za objekte (formBuilder). Obratite pažnju na pravila pisanja imena promenljivih: za objekte iz servisnog kontejnera koristimo mala slova i donju crtu ($form_builder), a za svojstva klase gde te objekte čuvamo koristimo camelCase sa malim prvim slovom (formBuilder).
Sada možemo koristiti objekat iz servisnog kontejnera u metodama naše klase:
/**
* Povratni poziv za modalni formular.
*/
public function openModalForm() {
...
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
...
}