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

In den vorherigen Artikeln haben wir besprochen, was Services und Dependency Injection (DI) sind und wie man sie in seinem Controller verwendet:

12.15. Services und Dependency Injection.
12.15.1. Dependency Injection im Controller

In diesem Artikel ein Beispiel, wie man Services über DI in eine Block-Klasse hinzufügt:

/modules/custom/drupalbook/src/Plugin/Block/CartBlock.php:

<?php

namespace Drupal\drupalbook\Plugin\Block;

use Drupal\commerce_cart\CartProviderInterface;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;


/**
 * Stellt einen Warenkorb-Block bereit.
 *
 * @Block(
 *   id = "commerce_cart",
 *   admin_label = @Translation("Warenkorb"),
 *   category = @Translation("Commerce")
 * )
 */
class CartBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * Der Warenkorb-Anbieter.
   *
   * @var \Drupal\commerce_cart\CartProviderInterface
   */
  protected $cartProvider;

  /**
   * Der Entity-Typ-Manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Konstruktor eines neuen CartBlock.
   *
   * @param array $configuration
   *   Ein Konfigurationsarray mit Informationen zur Plugin-Instanz.
   * @param string $plugin_id
   *   Die Plugin-ID der Plugin-Instanz.
   * @param mixed $plugin_definition
   *   Die Plugin-Implementierungsdefinition.
   * @param \Drupal\commerce_cart\CartProviderInterface $cart_provider
   *   Der Warenkorb-Anbieter.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   Der Entity-Typ-Manager.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, CartProviderInterface $cart_provider, EntityTypeManagerInterface $entity_type_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);

    $this->cartProvider = $cart_provider;
    $this->entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('commerce_cart.cart_provider'),
      $container->get('entity_type.manager')
    );
  }

  /**
   * Baut den Warenkorb-Block zusammen.
   *
   * @return array
   *   Ein Render-Array.
   */
  public function build() {
     ...
     
         /** @var \Drupal\commerce_order\Entity\OrderInterface[] $carts */
    $carts = $this->cartProvider->getCarts();
    ...
  }
}

Zuerst fügen wir der Block-Klasse das Interface ContainerFactoryPluginInterface hinzu:

class CartBlock extends BlockBase implements ContainerFactoryPluginInterface {

Danach definieren wir Eigenschaften, in denen wir die Service-Objekte speichern:

  protected $cartProvider;
  protected $entityTypeManager;

Als nächstes setzen wir die Standardparameter für das Plugin im Konstruktor:

  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);

Nach den Standardparametern für den Plugin-Konstruktor müssen wir die erforderlichen Parameter für die Service-Objekte übergeben:

  public function __construct(array $configuration, $plugin_id, $plugin_definition, CartProviderInterface $cart_provider, EntityTypeManagerInterface $entity_type_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);

    $this->cartProvider = $cart_provider;
    $this->entityTypeManager = $entity_type_manager;
  }

In der create()-Methode geben wir ebenfalls zuerst die Standardparameter für das Plugin an und danach die benötigten Service-Objekte:

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('commerce_cart.cart_provider'),
      $container->get('entity_type.manager')
    );
  }

Danach können wir die Service-Objekte aus der Variable $this verwenden:

  public function build() {
     ...
     
         /** @var \Drupal\commerce_order\Entity\OrderInterface[] $carts */
    $carts = $this->cartProvider->getCarts();
    ...
  }