Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll
19/04/2025, by Ivan

Menu

Նախորդ հոդվածում մենք դիտարկեցինք՝ ինչ է Dependency Injection-ը․

12.15. Սերվիսներ և Dependency Injection։

Այս հոդվածում ներկայացված է Dependency Injection-ի օրինակ՝ Controller-ում։

/modules/custom/drupalbook/src/Controller/ModalFormContactController.php:

<?php

namespace Drupal\drupalbook\Controller;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Form\FormBuilder;

/**
 * ModalFormContactController class.
 */
class ModalFormContactController extends ControllerBase {

  /**
   * The form builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

  /**
   * ModalFormContactController constructor.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   The form builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

  /**
   * {@inheritdoc}
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   The Drupal service container.
   *
   * @return static
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('form_builder')
    );
  }

  /**
   * Callback for modal form.
   */
  public function openModalForm() {
    $response = new AjaxResponse();
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    $enquiry_title = $this->t("Send an enquiry to @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
    $response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));

    return $response;
  }

}

Եկեք վերլուծենք Dependency Injection-ի մասերը կոդում։

namespace Drupal\drupalbook\Controller;

Սկզբում նշվում է namespace-ը, այն դիրքը, որտեղ գտնվում է տվյալ ֆայլը, որտեղ drupalbook-ը ձեր մոդուլի մեքենայական անունն է։

use Symfony\Component\DependencyInjection\ContainerInterface;

Միացնում ենք ContainerInterface դասը, որը կօգտագործենք՝ օբյեկտներ ստանալու համար Service Container-ից։

  /**
   * The form builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

Սահմանվում է հատկություն, որտեղ պահելու ենք Service Container-ից ստացված օբյեկտը։ @var \Namespace մեկնաբանությունը օգնում է ձեր IDE-ին ճիշտ ցույց տալ օբյեկտի մեթոդները autocomplete-ում։

  /**
   * ModalFormContactController constructor.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   The form builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

Կոնստրուկտորի մեջ փոխանցվում է Service Container-ից ստացվող օբյեկտը։ Այդ օբյեկտը ստեղծվելու է հաջորդ՝ create() մեթոդում։ Այստեղ մենք ստանում ենք այն և պահում վերևում հայտարարված $formBuilder հատկության մեջ։ Եթե միացնում եք նոր սերվիս, ապա այն պետք է հերթով ավելացնել __construct()-ում։ Այսպիսով, եթե միացնեք 10 սերվիս, ապա կունենաք 10 պարամետր։

  /**
   * {@inheritdoc}
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   The Drupal service container.
   *
   * @return static
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('form_builder')
    );
  }

create մեթոդում մենք ստանում ենք Service Container-ի օբյեկտը և վերադարձնում ենք $form_builder-ը, որը վերևում պահպանվում է formBuilder հատկության մեջ։ Ուշադրություն դարձրեք՝ Service Container-ից ստացվող օբյեկտների համար օգտագործվում է փոքրատառ ($form_builder), իսկ դասում դրանց պահման համար՝ camelCase (formBuilder)։

Այժմ կարող ենք օգտագործել այդ օբյեկտը դասի մեթոդների մեջ՝

  /**
   * Callback for modal form.
   */
  public function openModalForm() {
    ...
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    ...
  }