logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri
29/09/2025, by Ivan

Menu

Negli articoli precedenti abbiamo analizzato cosa sono i Services, la Dependency Injection (DI) e come utilizzarli nel nostro Controller e nel blocco:

12.15. Services e Dependency Injection.
12.15.1. Dependency Injection nel controller
12.15.2. Dependency Injection nel blocco

In questo articolo un esempio di come aggiungere i servizi tramite DI in una classe di form che estende FormBase:

<?php

namespace Drupal\drupalbook\Form;

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

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

  /**
   * Validatore email.
   *
   * @var \Egulias\EmailValidator\EmailValidator
   */
  protected $emailValidator;

  /**
   * Costruttore di un nuovo ModalForm.
   *
   * @param \Egulias\EmailValidator\EmailValidator $email_validator
   *   Il validatore email.
   */
  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('Il tuo indirizzo email'),
      '#required' => TRUE,
    ];

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

    return $form;
  }


  /**
   * Validazione email.
   */
  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 non è un indirizzo email valido.', array('%email' => $email)));
      }
    }
    else {
      $form_state->setErrorByName('email', $this->t("Per favore inserisci un indirizzo email."));
    }
    $form_state->setValue('email', $email);
  }

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

  /**
   * Ottiene i nomi delle configurazioni che saranno modificabili.
   *
   * @return array
   *   Un array di nomi degli oggetti di configurazione che possono essere modificati se chiamati
   *   insieme al metodo config() del trait.
   */
  protected function getEditableConfigNames() {
    return ['config.drupalbook_contact_form'];
  }
}

Per richiamare un servizio tramite DI in un form utilizziamo i metodi __construct e create(), esattamente come abbiamo fatto per il blocco.