2023-03-11 12:04:29 +03:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Zend Framework (http://framework.zend.com/)
|
|
|
|
*
|
|
|
|
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
2023-04-01 09:03:34 +03:00
|
|
|
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
2023-03-11 12:04:29 +03:00
|
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Zend\Cache;
|
|
|
|
|
|
|
|
use Traversable;
|
|
|
|
use Zend\EventManager\EventsCapableInterface;
|
|
|
|
use Zend\Stdlib\ArrayUtils;
|
|
|
|
|
|
|
|
abstract class StorageFactory
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Plugin manager for loading adapters
|
|
|
|
*
|
|
|
|
* @var null|Storage\AdapterPluginManager
|
|
|
|
*/
|
|
|
|
protected static $adapters = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Plugin manager for loading plugins
|
|
|
|
*
|
|
|
|
* @var null|Storage\PluginManager
|
|
|
|
*/
|
|
|
|
protected static $plugins = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The storage factory
|
|
|
|
* This can instantiate storage adapters and plugins.
|
|
|
|
*
|
|
|
|
* @param array|Traversable $cfg
|
|
|
|
* @return Storage\StorageInterface
|
|
|
|
* @throws Exception\InvalidArgumentException
|
|
|
|
*/
|
|
|
|
public static function factory($cfg)
|
|
|
|
{
|
|
|
|
if ($cfg instanceof Traversable) {
|
|
|
|
$cfg = ArrayUtils::iteratorToArray($cfg);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!is_array($cfg)) {
|
|
|
|
throw new Exception\InvalidArgumentException(
|
|
|
|
'The factory needs an associative array '
|
|
|
|
. 'or a Traversable object as an argument'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// instantiate the adapter
|
|
|
|
if (!isset($cfg['adapter'])) {
|
|
|
|
throw new Exception\InvalidArgumentException('Missing "adapter"');
|
|
|
|
}
|
|
|
|
$adapterName = $cfg['adapter'];
|
|
|
|
$adapterOptions = array();
|
|
|
|
if (is_array($cfg['adapter'])) {
|
|
|
|
if (!isset($cfg['adapter']['name'])) {
|
|
|
|
throw new Exception\InvalidArgumentException('Missing "adapter.name"');
|
|
|
|
}
|
|
|
|
|
|
|
|
$adapterName = $cfg['adapter']['name'];
|
|
|
|
$adapterOptions = isset($cfg['adapter']['options']) ? $cfg['adapter']['options'] : array();
|
|
|
|
}
|
|
|
|
if (isset($cfg['options'])) {
|
|
|
|
$adapterOptions = array_merge($adapterOptions, $cfg['options']);
|
|
|
|
}
|
|
|
|
|
|
|
|
$adapter = static::adapterFactory((string) $adapterName, $adapterOptions);
|
|
|
|
|
|
|
|
// add plugins
|
|
|
|
if (isset($cfg['plugins'])) {
|
|
|
|
if (!$adapter instanceof EventsCapableInterface) {
|
|
|
|
throw new Exception\RuntimeException(sprintf(
|
|
|
|
"The adapter '%s' doesn't implement '%s' and therefore can't handle plugins",
|
|
|
|
get_class($adapter),
|
|
|
|
'Zend\EventManager\EventsCapableInterface'
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!is_array($cfg['plugins'])) {
|
|
|
|
throw new Exception\InvalidArgumentException(
|
|
|
|
'Plugins needs to be an array'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($cfg['plugins'] as $k => $v) {
|
|
|
|
$pluginPrio = 1; // default priority
|
|
|
|
|
|
|
|
if (is_string($k)) {
|
|
|
|
if (!is_array($v)) {
|
|
|
|
throw new Exception\InvalidArgumentException(
|
|
|
|
"'plugins.{$k}' needs to be an array"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
$pluginName = $k;
|
|
|
|
$pluginOptions = $v;
|
|
|
|
} elseif (is_array($v)) {
|
|
|
|
if (!isset($v['name'])) {
|
|
|
|
throw new Exception\InvalidArgumentException("Invalid plugins[{$k}] or missing plugins[{$k}].name");
|
|
|
|
}
|
|
|
|
$pluginName = (string) $v['name'];
|
|
|
|
|
|
|
|
if (isset($v['options'])) {
|
|
|
|
$pluginOptions = $v['options'];
|
|
|
|
} else {
|
|
|
|
$pluginOptions = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($v['priority'])) {
|
|
|
|
$pluginPrio = $v['priority'];
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$pluginName = $v;
|
|
|
|
$pluginOptions = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
$plugin = static::pluginFactory($pluginName, $pluginOptions);
|
|
|
|
$adapter->addPlugin($plugin, $pluginPrio);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $adapter;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Instantiate a storage adapter
|
|
|
|
*
|
|
|
|
* @param string|Storage\StorageInterface $adapterName
|
|
|
|
* @param array|Traversable|Storage\Adapter\AdapterOptions $options
|
|
|
|
* @return Storage\StorageInterface
|
|
|
|
* @throws Exception\RuntimeException
|
|
|
|
*/
|
|
|
|
public static function adapterFactory($adapterName, $options = array())
|
|
|
|
{
|
|
|
|
if ($adapterName instanceof Storage\StorageInterface) {
|
|
|
|
// $adapterName is already an adapter object
|
|
|
|
$adapter = $adapterName;
|
|
|
|
} else {
|
|
|
|
$adapter = static::getAdapterPluginManager()->get($adapterName);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($options) {
|
|
|
|
$adapter->setOptions($options);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $adapter;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the adapter plugin manager
|
|
|
|
*
|
|
|
|
* @return Storage\AdapterPluginManager
|
|
|
|
*/
|
|
|
|
public static function getAdapterPluginManager()
|
|
|
|
{
|
|
|
|
if (static::$adapters === null) {
|
|
|
|
static::$adapters = new Storage\AdapterPluginManager();
|
|
|
|
}
|
|
|
|
return static::$adapters;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Change the adapter plugin manager
|
|
|
|
*
|
|
|
|
* @param Storage\AdapterPluginManager $adapters
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function setAdapterPluginManager(Storage\AdapterPluginManager $adapters)
|
|
|
|
{
|
|
|
|
static::$adapters = $adapters;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Resets the internal adapter plugin manager
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function resetAdapterPluginManager()
|
|
|
|
{
|
|
|
|
static::$adapters = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Instantiate a storage plugin
|
|
|
|
*
|
|
|
|
* @param string|Storage\Plugin\PluginInterface $pluginName
|
|
|
|
* @param array|Traversable|Storage\Plugin\PluginOptions $options
|
|
|
|
* @return Storage\Plugin\PluginInterface
|
|
|
|
* @throws Exception\RuntimeException
|
|
|
|
*/
|
|
|
|
public static function pluginFactory($pluginName, $options = array())
|
|
|
|
{
|
|
|
|
if ($pluginName instanceof Storage\Plugin\PluginInterface) {
|
|
|
|
// $pluginName is already a plugin object
|
|
|
|
$plugin = $pluginName;
|
|
|
|
} else {
|
|
|
|
$plugin = static::getPluginManager()->get($pluginName);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$options instanceof Storage\Plugin\PluginOptions) {
|
|
|
|
$options = new Storage\Plugin\PluginOptions($options);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($options) {
|
|
|
|
$plugin->setOptions($options);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $plugin;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the plugin manager
|
|
|
|
*
|
|
|
|
* @return Storage\PluginManager
|
|
|
|
*/
|
|
|
|
public static function getPluginManager()
|
|
|
|
{
|
|
|
|
if (static::$plugins === null) {
|
|
|
|
static::$plugins = new Storage\PluginManager();
|
|
|
|
}
|
|
|
|
return static::$plugins;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Change the plugin manager
|
|
|
|
*
|
|
|
|
* @param Storage\PluginManager $plugins
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function setPluginManager(Storage\PluginManager $plugins)
|
|
|
|
{
|
|
|
|
static::$plugins = $plugins;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Resets the internal plugin manager
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public static function resetPluginManager()
|
|
|
|
{
|
|
|
|
static::$plugins = null;
|
|
|
|
}
|
|
|
|
}
|