logo

Paleta de lienzo: ¡Hazlo colorido!🎨

Palette - Constructor visual de páginas, no se requiere título en diseño.

Demo en vivo Descargar Palette

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.