स्क्रॉल
12.15.3. BaseForm में डिपेंडेंसीज़ इंजेक्शन
पिछले लेखों में हमने देखा कि Services, Dependency Injection (DI) क्या हैं और उन्हें अपने Controller और ब्लॉक में कैसे उपयोग करें:
12.15. Services और Dependency Injection
12.15.1. कंट्रोलर में Dependency Injection
12.15.2. ब्लॉक में Dependency Injection
इस लेख में एक उदाहरण है कि फॉर्म क्लास, जो FormBase से इनहेरिट करता है, उसमें DI के माध्यम से सर्विसेज़ कैसे जोड़ते हैं:
<?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;
/**
* Constructs a new ModalForm.
*
* @param \Egulias\EmailValidator\EmailValidator $email_validator
* The 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('Your email address'),
'#required' => TRUE,
];
$form['actions']['send'] = [
'#type' => 'submit',
'#value' => $this->t('Send'),
];
return $form;
}
/**
* Email validation.
*/
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 an invalid email address.', array('%email' => $email)));
}
}
else {
$form_state->setErrorByName('email', $this->t("Please enter an email address."));
}
$form_state->setValue('email', $email);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
}
/**
* Gets the configuration names that will be editable.
*
* @return array
* An array of configuration object names that are editable if called in
* conjunction with the trait's config() method.
*/
protected function getEditableConfigNames() {
return ['config.drupalbook_contact_form'];
}
}
फॉर्म में DI के माध्यम से सर्विस को कॉल करने के लिए हम __construct और create() मेथड्स का उपयोग करते हैं, ठीक उसी तरह जैसे हमने ब्लॉक के लिए किया था।