12.15.5. Injection de dépendances dans une classe/service personnalisé(e)
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.