Scroll
          
        12.15.3. Կախվածությունների ներարկում BaseForm-ում
Նախորդ հոդվածներում մենք դիտարկել ենք՝ ինչ են սերվիսները, Dependency Injection-ը (DI) և ինչպես դրանք օգտագործել մեր Controller-ում և բլոկում․
12.15. Սերվիսներ և Dependency Injection։
12.15.1. Dependency Injection Controller-ում
12.15.2. Dependency Injection Բլոկում
Այս հոդվածում ներկայացված է օրինակ, թե ինչպես սերվիսներ ավելացնել DI-ի միջոցով 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;
/**
 * 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() մեթոդները՝ ճիշտ այնպես, ինչպես արեցինք բլոկի համար։