Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
2 / 2 |
CRAP | |
100.00% |
23 / 23 |
ReflectionFactory | |
100.00% |
1 / 1 |
|
100.00% |
2 / 2 |
10 | |
100.00% |
23 / 23 |
createInstance | |
100.00% |
1 / 1 |
2 | |
100.00% |
8 / 8 |
|||
getInstanceArguments | |
100.00% |
1 / 1 |
8 | |
100.00% |
15 / 15 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Component\Plugin\Factory\ReflectionFactory. | |
*/ | |
namespace Drupal\Component\Plugin\Factory; | |
/** | |
* A plugin factory that maps instance configuration to constructor arguments. | |
* | |
* Provides logic for any basic plugin type that needs to provide individual | |
* plugins based upon some basic logic. | |
*/ | |
class ReflectionFactory extends DefaultFactory { | |
/** | |
* {@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); | |
// Lets figure out of there's a constructor for this class and pull | |
// arguments from the $options array if so to populate it. | |
$reflector = new \ReflectionClass($plugin_class); | |
if ($reflector->hasMethod('__construct')) { | |
$arguments = $this->getInstanceArguments($reflector, $plugin_id, $plugin_definition, $configuration); | |
$instance = $reflector->newInstanceArgs($arguments); | |
} | |
else { | |
$instance = new $plugin_class(); | |
} | |
return $instance; | |
} | |
/** | |
* Inspects the plugin class and build a list of arguments for the constructor. | |
* | |
* This is provided as a helper method so factories extending this class can | |
* replace this and insert their own reflection logic. | |
* | |
* @param \ReflectionClass $reflector | |
* The reflector object being used to inspect the plugin class. | |
* @param string $plugin_id | |
* The identifier of the plugin implementation. | |
* @param mixed $plugin_definition | |
* The definition associated with the plugin_id. | |
* @param array $configuration | |
* An array of configuration that may be passed to the instance. | |
* | |
* @return array | |
* An array of arguments to be passed to the constructor. | |
*/ | |
protected function getInstanceArguments(\ReflectionClass $reflector, $plugin_id, $plugin_definition, array $configuration) { | |
$arguments = array(); | |
foreach ($reflector->getMethod('__construct')->getParameters() as $param) { | |
$param_name = $param->getName(); | |
if ($param_name == 'plugin_id') { | |
$arguments[] = $plugin_id; | |
} | |
elseif ($param_name == 'plugin_definition') { | |
$arguments[] = $plugin_definition; | |
} | |
elseif ($param_name == 'configuration') { | |
$arguments[] = $configuration; | |
} | |
elseif (isset($configuration[$param_name]) || array_key_exists($param_name, $configuration)) { | |
$arguments[] = $configuration[$param_name]; | |
} | |
elseif ($param->isDefaultValueAvailable()) { | |
$arguments[] = $param->getDefaultValue(); | |
} | |
else { | |
$arguments[] = NULL; | |
} | |
} | |
return $arguments; | |
} | |
} |