logo

Extra Block Types (EBT) - Nieuwe Layout Builder ervaring❗

Extra Block Types (EBT) - gestileerde, aanpasbare bloktypes: Slideshows, Tabs, Cards, Accordions en vele andere. Ingebouwde instellingen voor achtergrond, DOM Box, javascript-plugins. Ervaar vandaag al de toekomst van layout building.

Demo EBT-modules Download EBT-modules

❗Extra Paragraph Types (EPT) - Nieuwe Paragraphs ervaring

Extra Paragraph Types (EPT) - analoge op paragrafen gebaseerde set modules.

Demo EPT-modules Download EPT-modules

Scroll
29/09/2025, by Ivan

Menu

In de vorige artikelen hebben we besproken wat Services en Dependency Injection (DI) zijn en hoe je ze kunt gebruiken in je Controller en block:

12.15. Services en Dependency Injection.
12.15.1. Dependency Injection in de controller
12.15.2. Dependency Injection in een block

In dit artikel een voorbeeld van hoe je services via DI toevoegt in een klasse van een formulier die FormBase uitbreidt:

<?php

namespace Drupal\drupalbook\Form;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Egulias\EmailValidator\EmailValidator;

/**
 * Class ModalForm.
 */
class ModalForm extends FormBase {

  /**
   * Email validator.
   *
   * @var \Egulias\EmailValidator\EmailValidator
   */
  protected $emailValidator;

  /**
   * Construeert een nieuw ModalForm.
   *
   * @param \Egulias\EmailValidator\EmailValidator $email_validator
   *   De email validator.
   */
  public function __construct(EmailValidator $email_validator) {
    $this->emailValidator = $email_validator;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('email.validator')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'drupalbook_contact_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) {
    $form['email'] = [
      '#type' => 'email',
      '#title' => $this->t('Email'),
      '#description' => $this->t('Uw e-mailadres'),
      '#required' => TRUE,
    ];

    $form['actions']['send'] = [
      '#type' => 'submit',
      '#value' => $this->t('Verzenden'),
    ];

    return $form;
  }


  /**
   * Email-validatie.
   */
  protected function validateEmail(array &$form, FormStateInterface $form_state) {
    if (!$this->emailValidator->isValid($form_state->getValue('email'))) {
      return FALSE;
    }
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $email = $form_state->getValue('email');

    if (!empty($email)) {
      if (!$this->validateEmail($form, $form_state)) {
        $form_state->setErrorByName('email', $this->t('%email is een ongeldig e-mailadres.', array('%email' => $email)));
      }
    }
    else {
      $form_state->setErrorByName('email', $this->t("Vul een e-mailadres in."));
    }
    $form_state->setValue('email', $email);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    
  }

  /**
   * Haalt de configuratienamen op die bewerkbaar zullen zijn.
   *
   * @return array
   *   Een array van configuratieobjectnamen die bewerkbaar zijn als ze worden
   *   aangeroepen in combinatie met de config()-methode van de trait.
   */
  protected function getEditableConfigNames() {
    return ['config.drupalbook_contact_form'];
  }
}

Om een service via DI in een formulier aan te roepen gebruiken we de methoden __construct() en create(), net zoals we dat deden bij een block.