Dépendances de l'objet de configuration
Les objets de configuration peuvent déclarer des dépendances. Une dépendance peut être un module, un thème ou une entité.
Les dépendances d’un objet de configuration doivent être satisfaites avant que l’objet puisse être installé. Si les dépendances ne sont pas présentes et installées sur le site, l’installation de l’objet de configuration échouera. Un module doit déclarer dans son fichier YAML d’information les dépendances aux modules et thèmes nécessaires à ses objets de configuration.
En général, les développeurs de modules n’ont pas à se soucier de déclarer les dépendances des objets de configuration. En étendant les classes de base d’entités de configuration du noyau et en créant des plugins à partir des fournisseurs standards d’API de plugins, les dépendances sont calculées et déclarées automatiquement.
Vue d’ensemble
Les dépendances d’un objet de configuration sont déclarées via la clé config_dependencies
dans la définition de l’objet. Les clés de ce tableau peuvent être :
- content
- config
- module
- theme
Les objets de configuration définissent leurs dépendances en implémentant \Drupal\Core\Config\Entity\ConfigEntityInterface::calculateDependencies()
. Cette méthode doit être appelée depuis la méthode preSave()
de l’objet de configuration qui implémente \Drupal\Core\Entity\EntityInterface
. Les implémentations doivent utiliser la méthode utilitaire \Drupal\Core\Config\Entity\ConfigEntityBase::addDependency()
pour ajouter des dépendances. Toutes les implémentations du noyau appellent la méthode parente \Drupal\Core\Config\Entity\ConfigEntityBase::calculateDependencies()
, qui réinitialise les dépendances et fournit une implémentation pour détecter les fournisseurs de plugins nécessaires pour les objets de configuration qui implémentent \Drupal\Core\Entity\EntityWithPluginCollectionInterface
. Voir la documentation API du gestionnaire de dépendances de configuration pour plus de détails sur ces classes et méthodes.
Comment les dépendances de configuration sont calculées
Calcul basé sur les propriétés de l’objet de configuration
@todo – voir \Drupal\block\Entity\Block::calculateDependencies
Calcul basé sur d’autres objets de configuration
@todo – voir \Drupal\entity\EntityDisplayBase::calculateDependencies (exemple très complexe)
Calcul dans les plugins et leurs dérivés
@todo voir Drupal\Core\Config\Entity\ConfigEntityBase::calculateDependencies
– préciser que si l’objet config implémente EntityWithPluginBagInterface
, une dépendance au module fournissant le plugin est automatiquement ajoutée.
Les définitions de plugins dérivés sont issues d’un plugin de base. Par exemple, \Drupal\system\Plugin\Derivative\SystemMenuBlock
est un plugin dérivé de \Drupal\system\Plugin\Block\SystemMenuBlock
. Les blocs de menu système requièrent qu’une relation de dépendance soit établie entre l’objet de configuration du module de bloc et l’objet de configuration du menu fourni via ce bloc.
\Drupal\system\Plugin\Block\SystemMenuBlock
implémente la méthode getDerivativeDefinitions()
. Ainsi, les dérivés des blocs de menu, comme le bloc menu de pied de page de Bartik, dépendront de l’entité correspondante \Drupal\system\Entity\Menu
.
public function getDerivativeDefinitions($base_plugin_definition) { foreach ($this->menuStorage->loadMultiple() as $menu => $entity) { $this->derivatives[$menu] = $base_plugin_definition; $this->derivatives[$menu]['admin_label'] = $entity->label(); $this->derivatives[$menu]['config_dependencies']['config'] = array($entity->getConfigDependencyName()); } return $this->derivatives; }
Dans ce code, chaque dérivé du bloc de menu système reçoit une dépendance de configuration vers l’entité qui fournit le menu du bloc. Pour obtenir le nom de l’entité à utiliser comme identifiant de la dépendance de configuration, la méthode getConfigDependencyName()
de l’entité est appelée. Le nom de l’objet est une chaîne composée et ne doit pas être codé en dur là où la dépendance est déclarée.
La propriété config_dependencies
peut aussi être déclarée dans la définition du plugin. Cependant, les dépendances des objets de configuration sont essentiellement des valeurs dynamiques calculées. La déclaration d’une dépendance statique dans la définition d’un plugin est rare et doit être évitée.
Dépendances forcées
@todo – voir https://www.drupal.org/node/2404447.
Voir aussi Gestion de la configuration dans Drupal 8 pour plus d’informations sur l’export et l’import des fichiers de configuration.