12.15.2. Injection de dépendances dans un bloc
Dans les articles précédents, nous avons vu ce que sont les Services, l’Injection de dépendances (DI) et comment les utiliser dans un Controller :
12.15. Services et Injection de dépendances.
12.15.1. Injection de dépendances dans un contrôleur
Dans cet article, un exemple de comment ajouter des services via DI dans une classe de bloc :
/modules/custom/drupalbook/src/Plugin/Block/CartBlock.php :
<?php
namespace Drupal\drupalbook\Plugin\Block;
use Drupal\commerce_cart\CartProviderInterface;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Fournit un bloc panier.
*
* @Block(
* id = "commerce_cart",
* admin_label = @Translation("Panier"),
* category = @Translation("Commerce")
* )
*/
class CartBlock extends BlockBase implements ContainerFactoryPluginInterface {
/**
* Le fournisseur de panier.
*
* @var \Drupal\commerce_cart\CartProviderInterface
*/
protected $cartProvider;
/**
* Le gestionnaire de types d’entités.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Constructeur de CartBlock.
*
* @param array $configuration
* Tableau de configuration contenant les informations sur l’instance du plugin.
* @param string $plugin_id
* L’ID du plugin.
* @param mixed $plugin_definition
* La définition d’implémentation du plugin.
* @param \Drupal\commerce_cart\CartProviderInterface $cart_provider
* Le fournisseur de panier.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* Le gestionnaire de types d’entités.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, CartProviderInterface $cart_provider, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->cartProvider = $cart_provider;
$this->entityTypeManager = $entity_type_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('commerce_cart.cart_provider'),
$container->get('entity_type.manager')
);
}
/**
* Construit le bloc panier.
*
* @return array
* Un tableau de rendu.
*/
public function build() {
...
/** @var \Drupal\commerce_order\Entity\OrderInterface[] $carts */
$carts = $this->cartProvider->getCarts();
...
}
}
Premièrement, on ajoute l’interface ContainerFactoryPluginInterface
à la classe de notre bloc :
class CartBlock extends BlockBase implements ContainerFactoryPluginInterface {
Ensuite, on définit les propriétés dans lesquelles seront stockés les objets services :
protected $cartProvider;
protected $entityTypeManager;
Puis, on initialise les paramètres standards du plugin dans le constructeur :
public function __construct(array $configuration, $plugin_id, $plugin_definition) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
}
Après les paramètres standards du constructeur, on ajoute les paramètres nécessaires pour les objets services :
public function __construct(array $configuration, $plugin_id, $plugin_definition, CartProviderInterface $cart_provider, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->cartProvider = $cart_provider;
$this->entityTypeManager = $entity_type_manager;
}
Dans la méthode create()
, on précise aussi d’abord les paramètres standards du plugin, puis les services nécessaires :
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('commerce_cart.cart_provider'),
$container->get('entity_type.manager')
);
}
Après cela, on peut utiliser les objets services depuis la variable $this
:
public function build() {
...
/** @var \Drupal\commerce_order\Entity\OrderInterface[] $carts */
$carts = $this->cartProvider->getCarts();
...
}