Skip to content
This repository has been archived by the owner on Oct 29, 2020. It is now read-only.

Commit

Permalink
Custom providers
Browse files Browse the repository at this point in the history
  • Loading branch information
fabios committed Feb 25, 2014
1 parent 4c581f2 commit 8202ac4
Show file tree
Hide file tree
Showing 10 changed files with 439 additions and 53 deletions.
179 changes: 156 additions & 23 deletions DependencyInjection/Configuration.php
Expand Up @@ -21,6 +21,7 @@

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\NodeInterface;

/**
* Cache Bundle Configuration
Expand All @@ -30,15 +31,115 @@
*/
class Configuration implements ConfigurationInterface
{
/**
* @param array $parameters
*
* @return string
*/
public function getProviderParameters(array $parameters)
{
if (isset($parameters['type'])) {
unset($parameters['type']);
}

if (isset($parameters['aliases'])) {
unset($parameters['aliases']);
}

if (isset($parameters['namespace'])) {
unset($parameters['namespace']);
}

return $parameters;
}

/**
* @param array $parameters
*
* @return string
*/
public function resolveNodeType(array $parameters)
{
$values = $this->getProviderParameters($parameters);
$type = key($values);

return $type;
}

/**
* @param \Symfony\Component\Config\Definition\NodeInterface $tree
*
* @return array
*/
public function getProviderNames(NodeInterface $tree)
{
foreach ($tree->getChildren() as $providers) {

if ($providers->getName() !== 'providers') {
continue;
}

$children = $providers->getPrototype()->getChildren();
$providers = array_diff(array_keys($children), array('type', 'aliases', 'namespace'));

return $providers;
}

return array();
}

/**
* @param string $type
* @param \Symfony\Component\Config\Definition\NodeInterface $tree
*
* @return boolean
*/
public function isCustomProvider($type, NodeInterface $tree)
{
return ( ! in_array($type, $this->getProviderNames($tree)));
}

/**
* {@inheritDoc}
*/
public function getConfigTreeBuilder()
{
$builder = new TreeBuilder();
$node = $builder->root('doctrine_cache', 'array');
$self = $this;
$builder = new TreeBuilder();
$node = $builder->root('doctrine_cache', 'array');
$normalization = function ($conf) use ($self, $builder) {
$conf['type'] = isset($conf['type'])
? $conf['type']
: $self->resolveNodeType($conf);

if ($self->isCustomProvider($conf['type'], $builder->buildTree())) {
$params = $self->getProviderParameters($conf);
$options = reset($params);
$conf = array(
'type' => 'custom_provider',
'custom_provider' => array(
'type' => $conf['type'],
'options' => $options ?: null,
)
);
}

return $conf;
};

$node
->fixXmlConfig('custom_provider')
->children()
->arrayNode('custom_providers')
->useAttributeAsKey('type')
->prototype('array')
->children()
->scalarNode('prototype')->isRequired()->cannotBeEmpty()->end()
->scalarNode('definition_class')->defaultNull()->end()
->end()
->end()
->end()
->end()
->fixXmlConfig('alias', 'aliases')
->children()
->arrayNode('aliases')
Expand All @@ -52,24 +153,20 @@ public function getConfigTreeBuilder()
->useAttributeAsKey('name')
->prototype('array')
->beforeNormalization()
->ifTrue(function ($v) {
return ( ! isset($v['type']));
})
->then(function ($val) {
$copy = $val;

if (isset($copy['namespace'])) {
unset($copy['namespace']);
}

$val['type'] = key($copy);

return $val;
->ifTrue(function ($v) use ($self, $builder) {
return ( ! isset($v['type']) || ! $self->isCustomProvider($v['type'], $builder->buildTree()));
})
->then($normalization)
->end()
->children()
->scalarNode('namespace')->defaultNull()->end()
->scalarNode('type')->defaultNull()->end()
->append($this->addBasicProviderNode('apc'))
->append($this->addBasicProviderNode('array'))
->append($this->addBasicProviderNode('xcache'))
->append($this->addBasicProviderNode('wincache'))
->append($this->addBasicProviderNode('zenddata'))
->append($this->addCustomProviderNode())
->append($this->addMemcachedNode())
->append($this->addMemcacheNode())
->append($this->addCouchbaseNode())
Expand All @@ -93,10 +190,46 @@ public function getConfigTreeBuilder()
return $builder;
}

/**
* @param string $name
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addBasicProviderNode($name)
{
$builder = new TreeBuilder();
$node = $builder->root($name);

return $node;
}

/**
* Build custom node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addCustomProviderNode()
{
$builder = new TreeBuilder();
$node = $builder->root('custom_provider');

$node
->children()
->scalarNode('type')->isRequired()->cannotBeEmpty()->end()
->arrayNode('options')
->useAttributeAsKey('name')
->prototype('scalar')->end()
->end()
->end()
;

return $node;
}

/**
* Build memcache node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addMemcacheNode()
{
Expand Down Expand Up @@ -139,7 +272,7 @@ private function addMemcacheNode()
/**
* Build memcached node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addMemcachedNode()
{
Expand Down Expand Up @@ -182,7 +315,7 @@ private function addMemcachedNode()
/**
* Build redis node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addRedisNode()
{
Expand All @@ -203,7 +336,7 @@ private function addRedisNode()
/**
* Build riak node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addRiakNode()
{
Expand Down Expand Up @@ -232,7 +365,7 @@ private function addRiakNode()
/**
* Build couchbase node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addCouchbaseNode()
{
Expand All @@ -258,7 +391,7 @@ private function addCouchbaseNode()
/**
* Build mongodb node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addMongoNode()
{
Expand All @@ -281,7 +414,7 @@ private function addMongoNode()
/**
* Build php_file node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addPhpFileNode()
{
Expand All @@ -301,7 +434,7 @@ private function addPhpFileNode()
/**
* Build file_system node configuration definition
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The bucket property list tree builder
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
*/
private function addFileSystemNode()
{
Expand Down

0 comments on commit 8202ac4

Please sign in to comment.