12.15.5. Dependency Injection in einer benutzerdefinierten Klasse/einem Dienst
In den vorherigen Artikeln haben wir besprochen, was Services und Dependency Injection (DI) sind und wie man sie in seinem Controller, Block und Formular verwendet:
12.15. Services und Dependency Injection.
12.15.1. Dependency Injection im Controller
12.15.2. Dependency Injection im Block
12.15.3. Dependency Injection im BaseForm
12.15.4. Dependency Injection im ConfigFormBase Konfigurationsformular
In diesem Artikel ein Beispiel, wie man Services über DI in einer benutzerdefinierten Klasse/einem Dienst hinzufügt. Schauen wir uns das am Beispiel des Moduls Book an:
/core/modules/book/book.services.yml:
services:
book.manager:
class: Drupal\book\BookManager
arguments: ['@entity.manager', '@string_translation', '@config.factory', '@book.outline_storage', '@renderer']
In den arguments geben wir an, welche Objekte wir aus dem Service-Container erhalten möchten, daher müssen wir keine create()-Methode in unserer Klasse hinzufügen.
/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;
...
/**
* Definiert einen Book Manager.
*/
class BookManager implements BookManagerInterface {
/**
* Entity Manager Service Objekt.
*
* @var \Drupal\Core\Entity\EntityManagerInterface
*/
protected $entityManager;
/**
* Config Factory Service Objekt.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* Bücher Array.
*
* @var array
*/
protected $books;
/**
* Book Outline Storage.
*
* @var \Drupal\book\BookOutlineStorageInterface
*/
protected $bookOutlineStorage;
/**
* Speichert abgeflachte Buchbäume.
*
* @var array
*/
protected $bookTreeFlattened;
/**
* Der Renderer.
*
* @var \Drupal\Core\Render\RendererInterface
*/
protected $renderer;
/**
* Konstruktor eines BookManager Objekts.
*/
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;
}
...
}
Ich habe Code entfernt, der nicht mit DI zusammenhängt, damit es einfacher ist zu sehen, was in die benutzerdefinierte Klasse eingefügt werden muss. Ansonsten funktioniert das Hinzufügen von Services genauso wie im Controller.