logo

Types de blocs supplémentaires (EBT) – Nouvelle expérience de Layout Builder❗

Types de blocs supplémentaires (EBT) – types de blocs stylisés et personnalisables : diaporamas, onglets, cartes, accordéons et bien d’autres. Paramètres intégrés pour l’arrière-plan, la boîte DOM, les plugins JavaScript. Découvrez dès aujourd’hui le futur de la création de mises en page.

Démo des modules EBT Télécharger les modules EBT

❗Types de paragraphes supplémentaires (EPT) – Nouvelle expérience Paragraphes

Types de paragraphes supplémentaires (EPT) – ensemble de modules basé sur les paragraphes analogiques.

Démo des modules EPT Télécharger les modules EPT

Défilement
04/07/2025, by Ivan

Menu

Dans l’article précédent, nous avons examiné ce qu’est l’Injection de Dépendances :

12.15. Services et Injection de Dépendances.

Dans cet article, un exemple de code avec Injection de Dépendances dans un contrôleur.

/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 {

  /**
   * Le form builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

  /**
   * Constructeur de ModalFormContactController.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   Le form builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

  /**
   * {@inheritdoc}
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   Le conteneur de services Drupal.
   *
   * @return static
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('form_builder')
    );
  }

  /**
   * Callback pour le formulaire modal.
   */
  public function openModalForm() {
    $response = new AjaxResponse();
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    $enquiry_title = $this->t("Envoyer une demande à @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
    $response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));

    return $response;
  }

}

Examinons les parties du code pour l’Injection de Dépendances (DI).

namespace Drupal\drupalbook\Controller;

Tout d’abord, on indique le namespace (espace de noms), le chemin où se trouve ce fichier, où drupalbook est le nom machine de votre module.

use Symfony\Component\DependencyInjection\ContainerInterface;

On importe la classe ContainerInterface, que nous utiliserons plus tard pour récupérer des objets depuis le conteneur de services.

  /**
   * Le form builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

On déclare une propriété pour stocker l’objet provenant du conteneur de services. Le commentaire @var \Namespace aide votre IDE à proposer les bonnes méthodes en autocomplétion.

  /**
   * Constructeur de ModalFormContactController.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   Le form builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

Ensuite, dans le constructeur, on reçoit en paramètre l’objet depuis le conteneur de services. Cet objet est créé dans la méthode create() ci-dessous, et ici on l’assigne à la propriété déclarée plus haut $formBuilder. Si vous ajoutez un nouveau service, il faut ajouter un paramètre par paramètre dans __construct(). Donc si vous devez injecter 10 services, vous aurez 10 paramètres.

  /**
   * {@inheritdoc}
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   Le conteneur de services Drupal.
   *
   * @return static
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('form_builder')
    );
  }

Dans la méthode create, on récupère l’objet du conteneur de services et on retourne cet objet $form_builder que l’on stocke dans la propriété $formBuilder du constructeur. Notez la casse : pour les variables provenant du conteneur, on utilise le format lowercase ($form_builder), et pour les propriétés de la classe, on utilise camelCase avec une lettre minuscule (formBuilder).

Nous pouvons maintenant utiliser l’objet du conteneur de services dans les méthodes de notre classe :

  /**
   * Callback pour le formulaire modal.
   */
  public function openModalForm() {
    ...
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    ...
  }