166 lines
3.8 KiB
PHP
166 lines
3.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file
|
|
* Contains \Drupal\Component\Plugin\LazyPluginCollection.
|
|
*/
|
|
|
|
namespace Drupal\Component\Plugin;
|
|
|
|
/**
|
|
* Defines an object which stores multiple plugin instances to lazy load them.
|
|
*
|
|
* @ingroup plugin_api
|
|
*/
|
|
abstract class LazyPluginCollection implements \IteratorAggregate, \Countable {
|
|
|
|
/**
|
|
* Stores all instantiated plugins.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $pluginInstances = array();
|
|
|
|
/**
|
|
* Stores the IDs of all potential plugin instances.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $instanceIDs = array();
|
|
|
|
/**
|
|
* Initializes and stores a plugin.
|
|
*
|
|
* @param string $instance_id
|
|
* The ID of the plugin instance to initialize.
|
|
*/
|
|
abstract protected function initializePlugin($instance_id);
|
|
|
|
/**
|
|
* Gets the current configuration of all plugins in this collection.
|
|
*
|
|
* @return array
|
|
* An array of up-to-date plugin configuration.
|
|
*/
|
|
abstract public function getConfiguration();
|
|
|
|
/**
|
|
* Sets the configuration for all plugins in this collection.
|
|
*
|
|
* @param array $configuration
|
|
* An array of up-to-date plugin configuration.
|
|
*
|
|
* @return $this
|
|
*/
|
|
abstract public function setConfiguration($configuration);
|
|
|
|
/**
|
|
* Clears all instantiated plugins.
|
|
*/
|
|
public function clear() {
|
|
$this->pluginInstances = array();
|
|
}
|
|
|
|
/**
|
|
* Determines if a plugin instance exists.
|
|
*
|
|
* @param string $instance_id
|
|
* The ID of the plugin instance to check.
|
|
*
|
|
* @return bool
|
|
* TRUE if the plugin instance exists, FALSE otherwise.
|
|
*/
|
|
public function has($instance_id) {
|
|
return isset($this->pluginInstances[$instance_id]) || isset($this->instanceIDs[$instance_id]);
|
|
}
|
|
|
|
/**
|
|
* Gets a plugin instance, initializing it if necessary.
|
|
*
|
|
* @param string $instance_id
|
|
* The ID of the plugin instance being retrieved.
|
|
*/
|
|
public function &get($instance_id) {
|
|
if (!isset($this->pluginInstances[$instance_id])) {
|
|
$this->initializePlugin($instance_id);
|
|
}
|
|
return $this->pluginInstances[$instance_id];
|
|
}
|
|
|
|
/**
|
|
* Stores an initialized plugin.
|
|
*
|
|
* @param string $instance_id
|
|
* The ID of the plugin instance being stored.
|
|
* @param mixed $value
|
|
* An instantiated plugin.
|
|
*/
|
|
public function set($instance_id, $value) {
|
|
$this->pluginInstances[$instance_id] = $value;
|
|
$this->addInstanceId($instance_id);
|
|
}
|
|
|
|
/**
|
|
* Removes an initialized plugin.
|
|
*
|
|
* The plugin can still be used; it will be reinitialized.
|
|
*
|
|
* @param string $instance_id
|
|
* The ID of the plugin instance to remove.
|
|
*/
|
|
public function remove($instance_id) {
|
|
unset($this->pluginInstances[$instance_id]);
|
|
}
|
|
|
|
/**
|
|
* Adds an instance ID to the available instance IDs.
|
|
*
|
|
* @param string $id
|
|
* The ID of the plugin instance to add.
|
|
* @param array|null $configuration
|
|
* (optional) The configuration used by this instance. Defaults to NULL.
|
|
*/
|
|
public function addInstanceId($id, $configuration = NULL) {
|
|
if (!isset($this->instanceIDs[$id])) {
|
|
$this->instanceIDs[$id] = $id;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets all instance IDs.
|
|
*
|
|
* @return array
|
|
* An array of all available instance IDs.
|
|
*/
|
|
public function getInstanceIds() {
|
|
return $this->instanceIDs;
|
|
}
|
|
|
|
/**
|
|
* Removes an instance ID.
|
|
*
|
|
* @param string $instance_id
|
|
* The ID of the plugin instance to remove.
|
|
*/
|
|
public function removeInstanceId($instance_id) {
|
|
unset($this->instanceIDs[$instance_id]);
|
|
$this->remove($instance_id);
|
|
}
|
|
|
|
public function getIterator() {
|
|
$instances = [];
|
|
foreach ($this->getInstanceIds() as $instance_id) {
|
|
$instances[$instance_id] = $this->get($instance_id);
|
|
}
|
|
return new \ArrayIterator($instances);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function count() {
|
|
return count($this->instanceIDs);
|
|
}
|
|
|
|
}
|