12.15.1. Dependency injection in de controller
In het vorige artikel hebben we besproken wat Dependency Injection is:
12.15. Services en Dependency Injection.
In dit artikel een codevoorbeeld van Dependency Injection in een 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 {
/**
* De form builder.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
/**
* ModalFormContactController constructor.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* De form builder.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* De Drupal service container.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
/**
* Callback voor het modale formulier.
*/
public function openModalForm() {
$response = new AjaxResponse();
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
$enquiry_title = $this->t("Stuur een aanvraag naar @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
$response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));
return $response;
}
}
Laten we de delen van de code voor DI (Dependency Injection) doornemen.
namespace Drupal\drupalbook\Controller;
Eerst geven we het namespace (naamruimte) aan, de plek waar dit bestand zich bevindt, waarbij drupalbook de machine-naam van je module is.
use Symfony\Component\DependencyInjection\ContainerInterface;
We laden de klasse ContainerInterface, die we later gebruiken om objecten op te halen uit de Service Container.
/**
* De form builder.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
We declareren een property waarin we het object uit de Service Container opslaan. De annotatie @var \Namespace helpt je IDE te begrijpen welke methoden van het object getoond moeten worden in de autocomplete.
/**
* ModalFormContactController constructor.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* De form builder.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
Vervolgens ontvangen we in de constructor via een parameter het object uit de Service Container. Dit object maken we in de volgende methode create(), en hier slaan we het object op in de eerder gedeclareerde property $formBuilder. Als je een nieuwe service wilt toevoegen, moet je die parameter voor parameter toevoegen in __construct(). Dus als je 10 services wilt aansluiten, heb je 10 parameters.
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* De Drupal service container.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
In de methode create() halen we het object van de Service Container op en geven we het object $form_builder terug, dat we in de constructor hierboven opslaan in de property (formBuilder). Let op de schrijfwijze: voor objecten uit de Service Container gebruiken we lowercase ($form_builder), terwijl voor properties in de klasse waar we deze objecten opslaan we camelCase gebruiken met kleine letter (formBuilder).
Nu kunnen we het object uit de Service Container gebruiken in de methoden van onze klasse:
/**
* Callback voor het modale formulier.
*/
public function openModalForm() {
...
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
...
}