diff --git a/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginBase.php b/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginBase.php index 4bf1c6e..25fdb39 100644 --- a/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginBase.php +++ b/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginBase.php @@ -4,31 +4,19 @@ * @file * Contains \Drupal\Core\Plugin\ContainerFactoryPluginBase. */ + namespace Drupal\Core\Plugin; use Drupal\Component\Plugin\PluginBase; - use Symfony\Component\DependencyInjection\ContainerInterface; /** - * Defines a base plugin that can pull it's dependencies from the container. + * Defines a base plugin that can pull its dependencies from the container. */ -class ContainerFactoryPluginBase extends PluginBase { +abstract class ContainerFactoryPluginBase extends PluginBase { /** - * Creates an instance of the plugin. - * - * @param \Symfony\Component\DependencyInjection\ContainerInterface $container - * The container to pull out services used in the plugin. - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin_id for the plugin instance. - * @param array $plugin_definition - * The plugin implementation definition. - * - * @return static - * Returns an instance of this plugin. + * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) { return new static($configuration, $plugin_id, $plugin_definition); diff --git a/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginBase.php b/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginInterface.php similarity index 62% copy from core/lib/Drupal/Core/Plugin/ContainerFactoryPluginBase.php copy to core/lib/Drupal/Core/Plugin/ContainerFactoryPluginInterface.php index 4bf1c6e..edca91d 100644 --- a/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginBase.php +++ b/core/lib/Drupal/Core/Plugin/ContainerFactoryPluginInterface.php @@ -2,18 +2,17 @@ /** * @file - * Contains \Drupal\Core\Plugin\ContainerFactoryPluginBase. + * Contains \Drupal\Core\Plugin\ContainerFactoryPluginInterface. */ -namespace Drupal\Core\Plugin; -use Drupal\Component\Plugin\PluginBase; +namespace Drupal\Core\Plugin; use Symfony\Component\DependencyInjection\ContainerInterface; /** - * Defines a base plugin that can pull it's dependencies from the container. + * Defines an interface for pulling plugin dependencies from the container. */ -class ContainerFactoryPluginBase extends PluginBase { +interface ContainerFactoryPluginInterface { /** * Creates an instance of the plugin. @@ -23,15 +22,13 @@ class ContainerFactoryPluginBase extends PluginBase { * @param array $configuration * A configuration array containing information about the plugin instance. * @param string $plugin_id - * The plugin_id for the plugin instance. + * The plugin ID for the plugin instance. * @param array $plugin_definition * The plugin implementation definition. * * @return static * Returns an instance of this plugin. */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) { - return new static($configuration, $plugin_id, $plugin_definition); - } + public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition); } diff --git a/core/lib/Drupal/Core/Plugin/Factory/ContainerFactory.php b/core/lib/Drupal/Core/Plugin/Factory/ContainerFactory.php index cdf6f49..0990565 100644 --- a/core/lib/Drupal/Core/Plugin/Factory/ContainerFactory.php +++ b/core/lib/Drupal/Core/Plugin/Factory/ContainerFactory.php @@ -19,7 +19,14 @@ class ContainerFactory extends DefaultFactory { public function createInstance($plugin_id, array $configuration) { $plugin_definition = $this->discovery->getDefinition($plugin_id); $plugin_class = static::getPluginClass($plugin_id, $plugin_definition); - return $plugin_class::create(\Drupal::getContainer(), $configuration, $plugin_id, $plugin_definition); + + // If the plugin provides a factory method, pass the container to it. + if (is_subclass_of($plugin_class, 'Drupal\Core\Plugin\ContainerFactoryPluginInterface')) { + return $plugin_class::create(\Drupal::getContainer(), $configuration, $plugin_id, $plugin_definition); + } + + // Otherwise, create the plugin directly. + return new $plugin_class($configuration, $plugin_id, $plugin_definition); } }