logo

Palette - Mach es bunt🎨

Palette - Visueller Page Builder. Keine Designkenntnisse nötig.

Live-Demo Palette herunterladen

Scroll

12.15.4. Dependency Injection im ConfigFormBase Konfigurationsformular

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

In diesem Artikel ein Beispiel, wie man Services ĂĽber DI in einer Konfigurationsformular-Klasse, die von ConfigFormBase erbt, hinzufĂĽgt:

/modules/contrib/commerce_order_number/src/Form/SettingsForm.php:

<?php

namespace Drupal\commerce_order_number\Form;

use Drupal\commerce_order_number\OrderNumber;
use Drupal\commerce_order_number\OrderNumberFormatterInterface;
use Drupal\commerce_order_number\OrderNumberGeneratorManager;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Konfiguration der commerce_order_number Einstellungen fĂĽr diese Seite.
 */
class SettingsForm extends ConfigFormBase {

  /**
   * Der Manager fĂĽr die Bestellnummerngeneratoren.
   *
   * @var \Drupal\commerce_order_number\OrderNumberGeneratorManager
   */
  protected $orderNumberGeneratorManager;

  /**
   * Der Formatter fĂĽr Bestellnummern.
   *
   * @var \Drupal\commerce_order_number\OrderNumberFormatterInterface
   */
  protected $orderNumberFormatter;

  /**
   * Konstruktor eines neuen SettingsForm Objekts.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   Die Fabrik fĂĽr Konfigurationsobjekte.
   * @param \Drupal\commerce_order_number\OrderNumberGeneratorManager $order_number_generator_manager
   *   Der Manager fĂĽr die Bestellnummerngeneratoren.
   * @param \Drupal\commerce_order_number\OrderNumberFormatterInterface $order_number_formatter
   *   Der Formatter fĂĽr Bestellnummern.
   */
  public function __construct(ConfigFactoryInterface $config_factory, OrderNumberGeneratorManager $order_number_generator_manager, OrderNumberFormatterInterface $order_number_formatter) {
    parent::__construct($config_factory);

    $this->orderNumberGeneratorManager = $order_number_generator_manager;
    $this->orderNumberFormatter = $order_number_formatter;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('config.factory'),
      $container->get('plugin.manager.commerce_order_number_generator'),
      $container->get('commerce_order_number.order_number_formatter')
    );
  }

  /**
   * @inheritDoc
   */
  protected function getEditableConfigNames() {
    return ['commerce_order_number.settings'];
  }

  /**
   * @inheritDoc
   */
  public function getFormId() {
    return 'commerce_order_number_settings';
  }

  /**
   * @inheritDoc
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('commerce_order_number.settings');
    ...
    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $this->config('commerce_order_number.settings')
      ->set('generator', $form_state->getValue('generator'))
      ->set('padding', $form_state->getValue('padding'))
      ->set('pattern', $form_state->getValue('pattern'))
      ->set('force', $form_state->getValue('force'))
      ->save();

    parent::submitForm($form, $form_state);
  }

  /**
   * @inheritDoc
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);
    ...
    $example_order_number_formatted = $this->orderNumberFormatter->format($example_order_number, $padding, $pattern);
    ...
  }

}

Services fĂĽr Konfigurationsformulare werden genauso angebunden wie fĂĽr normale Formulare, mit den Methoden __construct() und create().