ContainerDerivativeDiscoveryDecorator.php 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. <?php
  2. namespace Drupal\Core\Plugin\Discovery;
  3. use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
  4. /**
  5. * Injects dependencies into derivers if they use ContainerDeriverInterface.
  6. *
  7. * @see \Drupal\Core\Plugin\Discovery\ContainerDeriverInterface
  8. */
  9. class ContainerDerivativeDiscoveryDecorator extends DerivativeDiscoveryDecorator {
  10. /**
  11. * {@inheritdoc}
  12. */
  13. protected function getDeriver($base_plugin_id, $base_definition) {
  14. if (!isset($this->derivers[$base_plugin_id])) {
  15. $this->derivers[$base_plugin_id] = FALSE;
  16. $class = $this->getDeriverClass($base_definition);
  17. if ($class) {
  18. // If the deriver provides a factory method, pass the container to it.
  19. if (is_subclass_of($class, '\Drupal\Core\Plugin\Discovery\ContainerDeriverInterface')) {
  20. /** @var \Drupal\Core\Plugin\Discovery\ContainerDeriverInterface $class */
  21. $this->derivers[$base_plugin_id] = $class::create(\Drupal::getContainer(), $base_plugin_id);
  22. }
  23. else {
  24. $this->derivers[$base_plugin_id] = new $class($base_plugin_id);
  25. }
  26. }
  27. }
  28. return $this->derivers[$base_plugin_id] ?: NULL;
  29. }
  30. }