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