12.15.1. Dependency Injection in un controller
Nell’articolo precedente abbiamo visto cosa è la Dependency Injection:
12.15. Services e Dependency Injection.
In questo articolo è riportato un esempio di codice con Dependency Injection in un 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;
/**
* Classe ModalFormContactController.
*/
class ModalFormContactController extends ControllerBase {
/**
* Il form builder.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
/**
* Costruttore ModalFormContactController.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* Il form builder.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* Il service container di Drupal.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
/**
* Callback per il form modale.
*/
public function openModalForm() {
$response = new AjaxResponse();
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
$enquiry_title = $this->t("Invia una richiesta a @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
$response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));
return $response;
}
}
Vediamo le parti di codice per la DI (Dependency Injection).
namespace Drupal\drupalbook\Controller;
Per prima cosa indichiamo il namespace, ovvero lo spazio dei nomi in cui si trova il file; in questo caso drupalbook è il machine name del vostro modulo.
use Symfony\Component\DependencyInjection\ContainerInterface;
Importiamo la classe ContainerInterface, che successivamente useremo per ottenere oggetti dal Service Container.
/**
* Il form builder.
*
* @var \Drupal\Core\Form\FormBuilder
*/
protected $formBuilder;
Dichiariamo la proprietà in cui salveremo l’oggetto proveniente dal Service Container. Il commento @var \Namespace aiuta la vostra IDE a capire quali metodi mostrare nell’autocompletamento.
/**
* Costruttore ModalFormContactController.
*
* @param \Drupal\Core\Form\FormBuilder $form_builder
* Il form builder.
*/
public function __construct(FormBuilder $form_builder) {
$this->formBuilder = $form_builder;
}
Nel costruttore riceviamo come parametro l’oggetto dal Service Container, che andremo a creare nel metodo create(). Qui riceviamo l’oggetto e lo salviamo nella proprietà dichiarata in precedenza $formBuilder. Se collegate un nuovo servizio, dovete aggiungerlo come parametro nel __construct(), quindi se servono 10 servizi, avrete 10 parametri.
/**
* {@inheritdoc}
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* Il service container di Drupal.
*
* @return static
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('form_builder')
);
}
Nel metodo create() otteniamo l’oggetto dal Service Container e ritorniamo l’oggetto $form_builder, che nel costruttore sopra abbiamo salvato nella proprietà formBuilder. Notate la convenzione: per le variabili provenienti dal Service Container si usa lowercase ($form_builder), mentre per le proprietà della classe si usa camelCase con la lettera iniziale minuscola (formBuilder).
Ora possiamo usare l’oggetto del Service Container nei metodi della nostra classe:
/**
* Callback per il form modale.
*/
public function openModalForm() {
...
$modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
...
}