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
25/05/2025, by Ivan

Menu

Im vorherigen Artikel haben wir betrachtet, was Dependency Injection ist:

12.15. Services und Dependency Injection.

In diesem Artikel wird ein Beispielcode mit Dependency Injection im Controller gezeigt.

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

/**
 * Klasse ModalFormContactController.
 */
class ModalFormContactController extends ControllerBase {

  /**
   * Der Form Builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

  /**
   * Konstruktor von ModalFormContactController.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   Der Form Builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

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

  /**
   * Callback für das modale Formular.
   */
  public function openModalForm() {
    $response = new AjaxResponse();
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    $enquiry_title = $this->t("Send an enquiry to @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
    $response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));

    return $response;
  }

}

Lasst uns die Code-Teile für DI (Dependency Injection) analysieren. 

namespace Drupal\drupalbook\Controller;

Zuerst geben wir den Namespace (Namensraum) an, den Speicherort der Datei, wobei drupalbook der Maschinenname Ihres Moduls ist.

use Symfony\Component\DependencyInjection\ContainerInterface;

Wir binden die Klasse ContainerInterface ein, die wir später verwenden, um Objekte aus dem Service Container zu erhalten.

  /**
   * Der Form Builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

Wir deklarieren eine Eigenschaft, in der wir das Objekt aus dem Service Container speichern. Der Kommentar @var \Namespace hilft Ihrer IDE, die Methoden des Objekts im Autocomplete anzuzeigen.

  /**
   * Konstruktor von ModalFormContactController.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   Der Form Builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

Im Konstruktor müssen wir als Parameter das Objekt aus dem Service Container erhalten, das wir in der nächsten Methode create() erzeugen, hier speichern wir das Objekt in der oben deklarierten Eigenschaft $formBuilder. Wenn Sie einen neuen Service einbinden, müssen Sie Parameter für Parameter im __construct() hinzufügen. Wenn Sie also 10 Services einbinden, haben Sie 10 Parameter.

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

In der Methode create erhalten wir das Service Container Objekt und geben das Objekt $form_builder zurück, das wir oben im Konstruktor in die Eigenschaft für Objekte (formBuilder) speichern. Beachten Sie die Schreibweise der Variablen: Für Objekte aus dem Service Container verwenden wir Kleinbuchstaben ($form_builder), für die Eigenschaften in der Klasse, in die wir die Objekte speichern, verwenden wir camelCase mit kleinem Anfangsbuchstaben (formBuilder).

Und jetzt können wir das Objekt aus dem Service Container in den Methoden unserer Klasse verwenden:

  /**
   * Callback für das modale Formular.
   */
  public function openModalForm() {
    ...
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    ...
  }