3 namespace Drupal\Core\Plugin;
5 use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
6 use Drupal\Component\Plugin\DependentPluginInterface;
7 use Drupal\Component\Plugin\PluginInspectionInterface;
8 use Drupal\Component\Utility\NestedArray;
9 use Drupal\Core\Entity\DependencyTrait;
10 use Drupal\Core\Plugin\Definition\DependentPluginDefinitionInterface;
13 * Provides a trait for calculating the dependencies of a plugin.
15 trait PluginDependencyTrait {
20 * Calculates and returns dependencies of a specific plugin instance.
22 * Dependencies are added for the module that provides the plugin, as well
23 * as any dependencies declared by the instance's calculateDependencies()
24 * method, if it implements
25 * \Drupal\Component\Plugin\DependentPluginInterface.
27 * @param \Drupal\Component\Plugin\PluginInspectionInterface $instance
28 * The plugin instance.
31 * An array of dependencies keyed by the type of dependency.
33 protected function getPluginDependencies(PluginInspectionInterface $instance) {
35 $definition = $instance->getPluginDefinition();
36 if ($definition instanceof PluginDefinitionInterface) {
37 $dependencies['module'][] = $definition->getProvider();
38 if ($definition instanceof DependentPluginDefinitionInterface && $config_dependencies = $definition->getConfigDependencies()) {
39 $dependencies = NestedArray::mergeDeep($dependencies, $config_dependencies);
42 elseif (is_array($definition)) {
43 $dependencies['module'][] = $definition['provider'];
44 // Plugins can declare additional dependencies in their definition.
45 if (isset($definition['config_dependencies'])) {
46 $dependencies = NestedArray::mergeDeep($dependencies, $definition['config_dependencies']);
50 // If a plugin is dependent, calculate its dependencies.
51 if ($instance instanceof DependentPluginInterface && $plugin_dependencies = $instance->calculateDependencies()) {
52 $dependencies = NestedArray::mergeDeep($dependencies, $plugin_dependencies);
58 * Calculates and adds dependencies of a specific plugin instance.
60 * Dependencies are added for the module that provides the plugin, as well
61 * as any dependencies declared by the instance's calculateDependencies()
62 * method, if it implements
63 * \Drupal\Component\Plugin\DependentPluginInterface.
65 * @param \Drupal\Component\Plugin\PluginInspectionInterface $instance
66 * The plugin instance.
68 protected function calculatePluginDependencies(PluginInspectionInterface $instance) {
69 $this->addDependencies($this->getPluginDependencies($instance));