Scroll
12.15.3. Dependency injection in BaseForm
In de vorige artikelen hebben we besproken wat Services en Dependency Injection (DI) zijn en hoe je ze kunt gebruiken in je Controller en block:
12.15. Services en Dependency Injection.
12.15.1. Dependency Injection in de controller
12.15.2. Dependency Injection in een block
In dit artikel een voorbeeld van hoe je services via DI toevoegt in een klasse van een formulier die FormBase uitbreidt:
<?php
namespace Drupal\drupalbook\Form;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Egulias\EmailValidator\EmailValidator;
/**
* Class ModalForm.
*/
class ModalForm extends FormBase {
/**
* Email validator.
*
* @var \Egulias\EmailValidator\EmailValidator
*/
protected $emailValidator;
/**
* Construeert een nieuw ModalForm.
*
* @param \Egulias\EmailValidator\EmailValidator $email_validator
* De email validator.
*/
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('Uw e-mailadres'),
'#required' => TRUE,
];
$form['actions']['send'] = [
'#type' => 'submit',
'#value' => $this->t('Verzenden'),
];
return $form;
}
/**
* Email-validatie.
*/
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 is een ongeldig e-mailadres.', array('%email' => $email)));
}
}
else {
$form_state->setErrorByName('email', $this->t("Vul een e-mailadres in."));
}
$form_state->setValue('email', $email);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
}
/**
* Haalt de configuratienamen op die bewerkbaar zullen zijn.
*
* @return array
* Een array van configuratieobjectnamen die bewerkbaar zijn als ze worden
* aangeroepen in combinatie met de config()-methode van de trait.
*/
protected function getEditableConfigNames() {
return ['config.drupalbook_contact_form'];
}
}
Om een service via DI in een formulier aan te roepen gebruiken we de methoden __construct() en create(), net zoals we dat deden bij een block.