From 1abe1f48ddd92253f106c72f9bb77dd3601c5e41 Mon Sep 17 00:00:00 2001 From: Lea Haensenberger Date: Mon, 28 Jan 2013 08:54:53 +0100 Subject: [PATCH] Having a parameter name defining a class for the serializer callback, because directly putting service id or parameter doesn't work because these values are not available at bundle configuration time --- DependencyInjection/Configuration.php | 2 +- DependencyInjection/FOSElasticaExtension.php | 8 ++++++-- README.md | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index f23f3a8..c68aba5 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -37,7 +37,7 @@ class Configuration implements ConfigurationInterface ->arrayNode('serializer') ->treatNullLike(array()) ->children() - ->scalarNode('callback')->defaultValue('foq_elastica.serializer.callback')->end() + ->scalarNode('callback')->defaultValue('foq_elastica.serializer.callback.class')->end() ->scalarNode('serializer')->defaultValue('serializer')->end() ->end() ->end() diff --git a/DependencyInjection/FOSElasticaExtension.php b/DependencyInjection/FOSElasticaExtension.php index 1c2cbe0..c1d8aa2 100644 --- a/DependencyInjection/FOSElasticaExtension.php +++ b/DependencyInjection/FOSElasticaExtension.php @@ -180,12 +180,16 @@ class FOSElasticaExtension extends Extension $typeDef->setFactoryService($indexId); $typeDef->setFactoryMethod('getType'); if ($serializerConfig) { - $serializerDef = clone $container->getDefinition($serializerConfig['callback']); + + $serializerDef = new Definition("%{$serializerConfig['callback']}%"); + $serializerId = sprintf('%s.%s.serializer.callback', $indexId, $name); + + $typeDef->addMethodCall('setSerializer', array(array(new Reference($serializerId), 'serialize'))); $serializerDef->addMethodCall('setSerializer', array(new Reference($serializerConfig['serializer']))); if (isset($type['serializer']['groups'])) { $serializerDef->addMethodCall('setGroups', array($type['serializer']['groups'])); } - $serializerId = sprintf('%s.%s.serializer.callback', $indexId, $name); + $container->setDefinition($serializerId, $serializerDef); $typeDef->addMethodCall('setSerializer', array(array(new Reference($serializerId), 'serialize'))); diff --git a/README.md b/README.md index e8ba475..8580481 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Elastica can handle objects instead of data arrays if a serializer callable is c callback: callback serializer: serializer -"callback" is the service having a public method serialize($object). "serializer" is the service id for the +"callback" is the name of a parameter defining a class having a public method serialize($object). "serializer" is the service id for the actual serializer, e.g. 'serializer' if you're using the JMSSerializerBundle. If this is configured you can use Elastica_Type::addObject instead of Elastica_Type::addDocument to add data to the index. The bundle provides a default implementation with a serializer service id 'serializer' that can be turned on by adding