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

12.15.5. Injection de dépendances dans une classe/service personnalisé(e)

04/07/2025, by Ivan

Menu

Dans les articles précédents, nous avons expliqué ce que sont les Services, l’Injection de Dépendances (DI) et comment les utiliser dans votre contrôleur, bloc et formulaire :

12.15. Services et Injection de Dépendances.
12.15.1. Injection de Dépendances dans un contrôleur
12.15.2. Injection de Dépendances dans un bloc
12.15.3. Injection de Dépendances dans BaseForm
12.15.4. Injection de Dépendances dans ConfigFormBase (formulaire de configuration)

Dans cet article, un exemple de comment ajouter des services via DI dans une classe/service personnalisé(e). Prenons l’exemple du module Book :

/core/modules/book/book.services.yml :

services:
  book.manager:
    class: Drupal\book\BookManager
    arguments: ['@entity.manager', '@string_translation', '@config.factory', '@book.outline_storage', '@renderer']

Dans arguments, nous indiquons quels objets nous souhaitons obtenir depuis le conteneur de services, donc il n’est pas nécessaire d’ajouter la méthode create() dans notre classe.

/core/modules/book/src/BookManager.php :

<?php

namespace Drupal\book;

use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
...

/**
 * Définit un gestionnaire de livres.
 */
class BookManager implements BookManagerInterface {

  /**
   * Objet Service Entity Manager.
   *
   * @var \Drupal\Core\Entity\EntityManagerInterface
   */
  protected $entityManager;

  /**
   * Objet Service Config Factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * Tableau de livres.
   *
   * @var array
   */
  protected $books;

  /**
   * Stockage de la structure du livre.
   *
   * @var \Drupal\book\BookOutlineStorageInterface
   */
  protected $bookOutlineStorage;

  /**
   * Stocke les arbres de livres aplatis.
   *
   * @var array
   */
  protected $bookTreeFlattened;

  /**
   * Le renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * Constructeur de l’objet BookManager.
   */
  public function __construct(EntityManagerInterface $entity_manager, TranslationInterface $translation, ConfigFactoryInterface $config_factory, BookOutlineStorageInterface $book_outline_storage, RendererInterface $renderer) {
    $this->entityManager = $entity_manager;
    $this->stringTranslation = $translation;
    $this->configFactory = $config_factory;
    $this->bookOutlineStorage = $book_outline_storage;
    $this->renderer = $renderer;
  }

  ...

}

J’ai supprimé le code non lié à l’injection de dépendances dans cet exemple afin de rendre plus clair ce qui doit être ajouté dans une classe personnalisée. Sinon, l’ajout des services se fait de la même manière que dans un contrôleur.