logo

Extra Block Types (EBT) - Neue Erfahrung im Layout Builder❗

Extra Block Types (EBT) - gestylte, anpassbare Blocktypen: Diashows, Registerkarten, Karten, Akkordeons und viele andere. Eingebaute Einstellungen für Hintergrund, DOM Box, Javascript Plugins. Erleben Sie die Zukunft der Layouterstellung schon heute.

Demo EBT-Module EBT-Module herunterladen

❗Extra Absatztypen (EPT) - Erfahrung mit neuen Absätzen

Extra Paragraph Types (EPT) - analoger, auf Absätzen basierender Satz von Modulen.

Demo EPT-Module EPT-Module herunterladen

Scroll

12.15.5. Dependency Injection in einer benutzerdefinierten Klasse/einem Dienst

25/05/2025, by Ivan

Menu

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.