Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
33.33% |
1 / 3 |
CRAP | |
72.73% |
16 / 22 |
DefaultFactory | |
0.00% |
0 / 1 |
|
33.33% |
1 / 3 |
13.45 | |
72.73% |
16 / 22 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
createInstance | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
getPluginClass | |
0.00% |
0 / 1 |
9.53 | |
81.25% |
13 / 16 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Component\Plugin\Factory\DefaultFactory. | |
*/ | |
namespace Drupal\Component\Plugin\Factory; | |
use Drupal\Component\Plugin\Definition\PluginDefinitionInterface; | |
use Drupal\Component\Plugin\Discovery\DiscoveryInterface; | |
use Drupal\Component\Plugin\Exception\PluginException; | |
/** | |
* Default plugin factory. | |
* | |
* Instantiates plugin instances by passing the full configuration array as a | |
* single constructor argument. Plugin types wanting to support plugin classes | |
* with more flexible constructor signatures can do so by using an alternate | |
* factory such as Drupal\Component\Plugin\Factory\ReflectionFactory. | |
*/ | |
class DefaultFactory implements FactoryInterface { | |
/** | |
* The object that retrieves the definitions of the plugins that this factory instantiates. | |
* | |
* The plugin definition includes the plugin class and possibly other | |
* information necessary for proper instantiation. | |
* | |
* @var \Drupal\Component\Plugin\Discovery\DiscoveryInterface | |
*/ | |
protected $discovery; | |
/** | |
* Defines an interface each plugin should implement. | |
* | |
* @var string|null | |
*/ | |
protected $interface; | |
/** | |
* Constructs a Drupal\Component\Plugin\Factory\DefaultFactory object. | |
* | |
* @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface $discovery | |
* The plugin discovery. | |
* @param string|null $plugin_interface | |
* (optional) The interface each plugin should implement. | |
*/ | |
public function __construct(DiscoveryInterface $discovery, $plugin_interface = NULL) { | |
$this->discovery = $discovery; | |
$this->interface = $plugin_interface; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function createInstance($plugin_id, array $configuration = array()) { | |
$plugin_definition = $this->discovery->getDefinition($plugin_id); | |
$plugin_class = static::getPluginClass($plugin_id, $plugin_definition, $this->interface); | |
return new $plugin_class($configuration, $plugin_id, $plugin_definition); | |
} | |
/** | |
* Finds the class relevant for a given plugin. | |
* | |
* @param string $plugin_id | |
* The id of a plugin. | |
* @param \Drupal\Component\Plugin\Definition\PluginDefinitionInterface|mixed[] $plugin_definition | |
* The plugin definition associated with the plugin ID. | |
* @param string $required_interface | |
* (optional) THe required plugin interface. | |
* | |
* @return string | |
* The appropriate class name. | |
* | |
* @throws \Drupal\Component\Plugin\Exception\PluginException | |
* Thrown when there is no class specified, the class doesn't exist, or | |
* the class does not implement the specified required interface. | |
* | |
*/ | |
public static function getPluginClass($plugin_id, $plugin_definition = NULL, $required_interface = NULL) { | |
$missing_class_message = sprintf('The plugin (%s) did not specify an instance class.', $plugin_id); | |
if (is_array($plugin_definition)) { | |
if (empty($plugin_definition['class'])) { | |
throw new PluginException($missing_class_message); | |
} | |
$class = $plugin_definition['class']; | |
} | |
elseif ($plugin_definition instanceof PluginDefinitionInterface) { | |
if (!$plugin_definition->getClass()) { | |
throw new PluginException($missing_class_message); | |
} | |
$class = $plugin_definition->getClass(); | |
} | |
else { | |
$plugin_definition_type = is_object($plugin_definition) ? get_class($plugin_definition) : gettype($plugin_definition); | |
throw new PluginException(sprintf('%s can only handle plugin definitions that are arrays or that implement %s, but %s given.', __CLASS__, PluginDefinitionInterface::class, $plugin_definition_type)); | |
} | |
if (!class_exists($class)) { | |
throw new PluginException(sprintf('Plugin (%s) instance class "%s" does not exist.', $plugin_id, $class)); | |
} | |
if ($required_interface && !is_subclass_of($class, $required_interface)) { | |
throw new PluginException(sprintf('Plugin "%s" (%s) must implement interface %s.', $plugin_id, $class, $required_interface)); | |
} | |
return $class; | |
} | |
} |