Scroll
12.15.3. Inyección de dependencias en BaseForm
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.