Configuratieobjectafhankelijkheden
Configuratieobjecten kunnen afhankelijkheden declareren. Een afhankelijkheid kan een module, een thema of een entiteit zijn.
De afhankelijkheden van een configuratieobject moeten geïnstalleerd zijn voordat het configuratieobject zelf kan worden geïnstalleerd. Als de afhankelijkheden ontbreken en niet op de site aanwezig zijn, kan het configuratieobject niet worden geïnstalleerd. Een module moet in zijn info YAML-bestand de module- en thema-afhankelijkheden declareren die nodig zijn voor zijn configuratieobjecten.
In de meeste gevallen hoeven moduleontwikkelaars zich niet bezig te houden met het handmatig declareren van afhankelijkheden voor configuratieobjecten. Door de basisklassen van configuratie-entiteiten van de core uit te breiden en plug-ins te maken op basis van standaard plug-in API-providers, worden afhankelijkheden automatisch berekend en gedeclareerd.
Overzicht
Afhankelijkheden van configuratieobjecten worden gedeclareerd met de sleutel config_dependencies in de definitie van het configuratieobject. De sleutels van deze array kunnen de volgende zijn:
- content
- config
- module
- theme
Configuratieobjecten definiëren hun afhankelijkheden door \Drupal\Core\Config\Entity\ConfigEntityInterface::calculateDependencies() te implementeren. Deze methode moet worden aangeroepen vanuit de implementatie van het configuratieobject \Drupal\Core\Entity\EntityInterface::preSave(). Implementaties moeten de hulpmethode \Drupal\Core\Config\Entity\ConfigEntityBase::addDependency() gebruiken om afhankelijkheden toe te voegen. Alle implementaties in de core roepen de parentmethode \Drupal\Core\Config\Entity\ConfigEntityBase::calculateDependencies() aan, die de afhankelijkheden reset en een implementatie biedt voor het bepalen van de providers van plug-in modules voor configuratieobjecten die \Drupal\Core\Entity\EntityWithPluginCollectionInterface implementeren. Zie de API-documentatie van de ConfigDependencyManager voor meer informatie over deze klassen en methoden.
Hoe configuratieafhankelijkheden worden berekend
Afhankelijkheden berekenen op basis van eigenschappen van het configuratieobject
@todo - zie \Drupal\block\Entity\Block::calculateDependencies
Afhankelijkheden berekenen op basis van andere configuratieobjecten
@todo - zie \Drupal\entity\EntityDisplayBase::calculateDependencies (dit is een zeer complex voorbeeld hiervan)
Afhankelijkheden berekenen in plug-ins en hun derivaten
@todo - zie Drupal\Core\Config\Entity\ConfigEntityBase::calculateDependencies - verduidelijk het feit dat een configobject EntityWithPluginBagInterface implementeert, waarna automatisch een afhankelijkheid naar de module die de plug-in levert wordt toegevoegd.
Definities van afgeleide plug-ins worden afgeleid van de basisplug-in. Bijvoorbeeld, \Drupal\system\Plugin\Derivative\SystemMenuBlock is een afgeleide plug-in van \Drupal\system\Plugin\Block\SystemMenuBlock. Systeembalkblokken vereisen dat er een afhankelijkheidsrelatie wordt ingesteld tussen het configuratieobject van de blockmodule en het configuratieobject van het menu dat via het blok wordt geleverd.
\Drupal\system\Plugin\Block\SystemMenuBlock implementeert de methode getDerivativeDefinitions(). Daarom zullen afgeleide menublokken, zoals het footer-menu van Bartik, afhankelijk zijn van de bijbehorende entiteit \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;
}
In de bovenstaande code krijgt elke afgeleide van het system menu-blok een configuratieafhankelijkheid toegewezen naar het object dat het menublok levert. Om de entiteitsnaam te verkrijgen die moet worden gebruikt om de configuratieafhankelijkheid te identificeren, wordt de methode getConfigDependencyName() van de entiteit aangeroepen. De naam van het object is een samengestelde string en mag niet hardcoded worden waar de afhankelijkheid wordt gedeclareerd.
De eigenschap config_dependencies kan ook worden gedeclareerd als onderdeel van de plug-in definitie. Afhankelijkheden van configuratieobjecten zijn echter meestal dynamische waarden en worden daarom berekend. Het declareren van een statische afhankelijkheid in een plug-indefinitie komt zelden voor en moet vermeden worden.
Geforceerde afhankelijkheden
@todo - zie https://www.drupal.org/node/2404447.
Zie Configuratiebeheer in Drupal 8 voor meer informatie over het exporteren en importeren van configuratiebestanden.