Изучение внедрения зависимостей в пользовательские блоки в Drupal 9: подробное руководство

В Drupal 9 пользовательские блоки — это мощный способ расширить функциональность вашего веб-сайта. Они позволяют создавать повторно используемые компоненты, которые можно размещать в разных регионах вашего сайта. Чтобы сделать ваши пользовательские блоки более гибкими и удобными в обслуживании, важно понимать и реализовывать внедрение зависимостей. В этой статье мы рассмотрим различные методы использования внедрения зависимостей в пользовательские блоки Drupal 9, а также приведем примеры кода.

Метод 1: внедрение конструктора
Одним из наиболее распространенных методов внедрения зависимостей является внедрение конструктора. Он предполагает передачу зависимостей классу блока через его конструктор. Вот пример:

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class CustomBlock extends BlockBase implements ContainerFactoryPluginInterface {
  protected $myService;
  public function __construct(array $configuration, $plugin_id, $plugin_definition, MyService $myService) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->myService = $myService;
  }
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('my_service')
    );
  }
// Rest of the block implementation...
}

Метод 2: внедрение сеттера
Внедрение сеттера включает в себя внедрение зависимостей через методы сеттера. Вот пример:

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class CustomBlock extends BlockBase implements ContainerFactoryPluginInterface {
  protected $myService;
  public function setMyService(MyService $myService) {
    $this->myService = $myService;
  }
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = new static($configuration, $plugin_id, $plugin_definition);
    $instance->setMyService($container->get('my_service'));
    return $instance;
  }
// Rest of the block implementation...
}

Метод 3: внедрение сервиса
В Drupal вы также можете определить свой пользовательский блок как сервис и внедрить зависимости непосредственно в определение сервиса. Вот пример:

services:
  my_module.custom_block:
    class: Drupal\my_module\Plugin\Block\CustomBlock
    arguments: ['@my_service']
    tags:
      - { name: block }
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
class CustomBlock extends BlockBase implements ContainerFactoryPluginInterface {
  protected $myService;
  public function __construct(array $configuration, $plugin_id, $plugin_definition, MyService $myService) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->myService = $myService;
  }
// Rest of the block implementation...
}

Использование внедрения зависимостей в пользовательских блоках в Drupal 9 обеспечивает более модульный, тестируемый и удобный в обслуживании подход к созданию вашего веб-сайта. В этой статье мы рассмотрели три метода реализации внедрения зависимостей: внедрение конструктора, внедрение установщика и внедрение сервиса. Используя эти методы, вы можете создавать собственные блоки, отделенные от своих зависимостей, что упрощает управление и расширение.