Introduce type prototype configuration

This commit is contained in:
ornicar 2011-04-27 13:24:29 -07:00
parent 64ea7cb98d
commit cb3fae7925
2 changed files with 61 additions and 2 deletions

View file

@ -66,6 +66,42 @@ class Configuration
->performNoDeepMerging()
->children()
->scalarNode('client')->end()
->arrayNode('type_prototype')
->children()
->arrayNode('doctrine')
->children()
->scalarNode('driver')->end()
->scalarNode('identifier')->defaultValue('id')->end()
->arrayNode('provider')
->children()
->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
->scalarNode('batch_size')->defaultValue(100)->end()
->scalarNode('clear_object_manager')->defaultTrue()->end()
->scalarNode('service')->end()
->end()
->end()
->arrayNode('finder')
->children()
->scalarNode('service')->end()
->end()
->end()
->arrayNode('elastica_to_model_transformer')
->addDefaultsIfNotSet()
->children()
->scalarNode('hydrate')->defaultTrue()->end()
->scalarNode('service')->end()
->end()
->end()
->arrayNode('model_to_elastica_transformer')
->addDefaultsIfNotSet()
->children()
->scalarNode('service')->end()
->end()
->end()
->end()
->end()
->end()
->end()
->end()
->append($this->getTypesNode())
->end()

View file

@ -103,7 +103,8 @@ class FOQElasticaExtension extends Extension
$indexDef->setFactoryService($clientId);
$indexDef->setFactoryMethod('getIndex');
$container->setDefinition($indexId, $indexDef);
$this->loadTypes(isset($index['types']) ? $index['types'] : array(), $container, $name, $indexId);
$typePrototypeConfig = isset($index['type_prototype']) ? $index['type_prototype'] : array();
$this->loadTypes(isset($index['types']) ? $index['types'] : array(), $container, $name, $indexId, $typePrototypeConfig);
$indexIds[$name] = $indexId;
}
@ -116,9 +117,10 @@ class FOQElasticaExtension extends Extension
* @param array $config An array of types configurations
* @param ContainerBuilder $container A ContainerBuilder instance
*/
protected function loadTypes(array $types, ContainerBuilder $container, $indexName, $indexId)
protected function loadTypes(array $types, ContainerBuilder $container, $indexName, $indexId, array $typePrototypeConfig)
{
foreach ($types as $name => $type) {
$type = self::deepArrayUnion($typePrototypeConfig, $type);
$typeId = sprintf('%s.%s', $indexId, $name);
$typeDefArgs = array($name);
$typeDef = new Definition('%foq_elastica.type.class%', $typeDefArgs);
@ -134,6 +136,27 @@ class FOQElasticaExtension extends Extension
}
}
/**
* Merges two arrays without reindexing numeric keys.
*
* @param array $array1 An array to merge
* @param array $array2 An array to merge
*
* @return array The merged array
*/
static protected function deepArrayUnion($array1, $array2)
{
foreach ($array2 as $key => $value) {
if (is_array($value) && isset($array1[$key]) && is_array($array1[$key])) {
$array1[$key] = self::deepArrayUnion($array1[$key], $value);
} else {
$array1[$key] = $value;
}
}
return $array1;
}
/**
* Loads the optional provider and finder for a type
*