Défilement
12.15.3. Injection de dépendances dans BaseForm
Dans les articles précédents, nous avons vu ce que sont les Services, l’Injection de Dépendances (DI) et comment les utiliser dans un Controller ou un bloc :
12.15. Services et Injection de Dépendances.
12.15.1. Injection de Dépendances dans un contrôleur
12.15.2. Injection de Dépendances dans un bloc
Dans cet article, un exemple montrant comment ajouter des services via DI dans une classe de formulaire héritant 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;
/**
* Classe ModalForm.
*/
class ModalForm extends FormBase {
/**
* Validateur d’email.
*
* @var \Egulias\EmailValidator\EmailValidator
*/
protected $emailValidator;
/**
* Constructeur de ModalForm.
*
* @param \Egulias\EmailValidator\EmailValidator $email_validator
* Le validateur d’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('Votre adresse email'),
'#required' => TRUE,
];
$form['actions']['send'] = [
'#type' => 'submit',
'#value' => $this->t('Envoyer'),
];
return $form;
}
/**
* Validation de l’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 est une adresse email invalide.', ['%email' => $email]));
}
}
else {
$form_state->setErrorByName('email', $this->t("Veuillez saisir une adresse email."));
}
$form_state->setValue('email', $email);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// Traitement à l’envoi du formulaire.
}
/**
* Obtient les noms des configurations modifiables.
*
* @return array
* Un tableau des noms d’objets de configuration modifiables.
*/
protected function getEditableConfigNames() {
return ['config.drupalbook_contact_form'];
}
}
Pour appeler un service via DI dans un formulaire, on utilise les méthodes __construct
et create()
, comme nous l’avons fait pour les blocs.