<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Cache;
use Traversable;
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 (!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 an 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;
}
}
# |
Change |
User |
Description |
Committed |
|
#1
|
18334 |
Liz Lam |
initial add of jambox |
|
|