Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll
04/05/2025, by Ivan

Menu

En los artículos anteriores analizamos qué son los Servicios, la Inyección de Dependencias (DI) y cómo utilizarlos en un Controlador y un Bloque:

12.15. Servicios e Inyección de Dependencias.
12.15.1. Inyección de dependencias en el controlador
12.15.2. Inyección de dependencias en un bloque

En este artículo se muestra un ejemplo de cómo añadir servicios mediante DI en una clase de formulario que hereda de 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;

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

  /**
   * Validador de correo electrónico.
   *
   * @var \Egulias\EmailValidator\EmailValidator
   */
  protected $emailValidator;

  /**
   * Constructor de ModalForm.
   *
   * @param \Egulias\EmailValidator\EmailValidator $email_validator
   *   El validador de correos electrónicos.
   */
  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('Correo electrónico'),
      '#description' => $this->t('Tu dirección de correo electrónico'),
      '#required' => TRUE,
    ];

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

    return $form;
  }

  /**
   * Validación del correo electrónico.
   */
  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 no es una dirección de correo válida.', ['%email' => $email]));
      }
    }
    else {
      $form_state->setErrorByName('email', $this->t("Por favor, introduce una dirección de correo electrónico."));
    }
    $form_state->setValue('email', $email);
  }

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

  /**
   * Obtiene los nombres de configuración que serán editables.
   *
   * @return array
   *   Un array con los nombres de los objetos de configuración editables.
   */
  protected function getEditableConfigNames() {
    return ['config.drupalbook_contact_form'];
  }
}

Para llamar a un servicio mediante DI en un formulario, utilizamos los métodos __construct() y create(), de la misma forma que lo hicimos en el bloque.