From ca6991d494e78844ce1007fecef5479a2a40b739 Mon Sep 17 00:00:00 2001 From: Tim Nagel Date: Mon, 23 Jun 2014 23:05:57 +1000 Subject: [PATCH] Fix serializer --- DependencyInjection/FOSElasticaExtension.php | 55 ++++++++++++------- Resources/config/serializer.xml | 14 +++++ Tests/Functional/app/ORM/bundles.php | 4 +- Tests/Functional/app/ORM/config.yml | 4 ++ .../ModelToElasticaIdentifierTransformer.php | 1 + composer.json | 1 + 6 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 Resources/config/serializer.xml diff --git a/DependencyInjection/FOSElasticaExtension.php b/DependencyInjection/FOSElasticaExtension.php index 158bea5..aa00b18 100644 --- a/DependencyInjection/FOSElasticaExtension.php +++ b/DependencyInjection/FOSElasticaExtension.php @@ -5,7 +5,6 @@ namespace FOS\ElasticaBundle\DependencyInjection; use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\DefinitionDecorator; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\Config\FileLocator; @@ -35,8 +34,6 @@ class FOSElasticaExtension extends Extension */ private $loadedDrivers = array(); - protected $serializerConfig = array(); - public function load(array $configs, ContainerBuilder $container) { $configuration = $this->getConfiguration($configs, $container); @@ -63,7 +60,11 @@ class FOSElasticaExtension extends Extension $config['default_index'] = reset($keys); } - $this->serializerConfig = isset($config['serializer']) ? $config['serializer'] : null; + if (isset($config['serializer'])) { + $loader->load('serializer.xml'); + + $this->loadSerializer($config['serializer'], $container); + } $this->loadClients($config['clients'], $container); $container->setAlias('fos_elastica.client', sprintf('fos_elastica.client.%s', $config['default_client'])); @@ -253,27 +254,20 @@ class FOSElasticaExtension extends Extension $indexableCallbacks[sprintf('%s/%s', $indexName, $name)] = $type['indexable_callback']; } - /*if ($this->serializerConfig) { - $callbackDef = new Definition($this->serializerConfig['callback_class']); - $callbackId = sprintf('%s.%s.serializer.callback', $indexId, $name); + if ($container->hasDefinition('fos_elastica.serializer_callback_prototype')) { + $typeSerializerId = sprintf('%s.serializer.callback', $typeId); + $typeSerializerDef = new DefinitionDecorator('fos_elastica.serializer_callback_prototype'); - $typeDef->addMethodCall('setSerializer', array(array(new Reference($callbackId), 'serialize'))); - $callbackDef->addMethodCall('setSerializer', array(new Reference($this->serializerConfig['serializer']))); if (isset($type['serializer']['groups'])) { - $callbackDef->addMethodCall('setGroups', array($type['serializer']['groups'])); + $typeSerializerDef->addMethodCall('setGroups', array($type['serializer']['groups'])); } if (isset($type['serializer']['version'])) { - $callbackDef->addMethodCall('setVersion', array($type['serializer']['version'])); - } - $callbackClassImplementedInterfaces = class_implements($this->serializerConfig['callback_class']); // PHP < 5.4 friendly - if (isset($callbackClassImplementedInterfaces['Symfony\Component\DependencyInjection\ContainerAwareInterface'])) { - $callbackDef->addMethodCall('setContainer', array(new Reference('service_container'))); + $typeSerializerDef->addMethodCall('setVersion', array($type['serializer']['version'])); } - $container->setDefinition($callbackId, $callbackDef); - - $typeDef->addMethodCall('setSerializer', array(array(new Reference($callbackId), 'serialize'))); - }*/ + $typeDef->addMethodCall('setSerializer', array(array(new Reference($typeSerializerId), 'serialize'))); + $container->setDefinition($typeSerializerId, $typeSerializerDef); + } } $indexable = $container->getDefinition('fos_elastica.indexable'); @@ -358,7 +352,7 @@ class FOSElasticaExtension extends Extension return $typeConfig['model_to_elastica_transformer']['service']; } - $abstractId = $this->serializerConfig ? + $abstractId = $container->hasDefinition('fos_elastica.serializer_callback_prototype') ? 'fos_elastica.model_to_elastica_identifier_transformer' : 'fos_elastica.model_to_elastica_transformer'; @@ -391,7 +385,7 @@ class FOSElasticaExtension extends Extension $typeConfig['model'], ); - if ($this->serializerConfig) { + if ($container->hasDefinition('fos_elastica.serializer_callback_prototype')) { $abstractId = 'fos_elastica.object_serializer_persister'; $callbackId = sprintf('%s.%s.serializer.callback', $this->indexConfigs[$indexName]['reference'], $typeName); $arguments[] = array(new Reference($callbackId), 'serialize'); @@ -588,6 +582,25 @@ class FOSElasticaExtension extends Extension $this->loadedDrivers[] = $driver; } + /** + * Loads and configures the serializer prototype. + * + * @param array $config + * @param ContainerBuilder $container + */ + private function loadSerializer($config, ContainerBuilder $container) + { + $container->setAlias('fos_elastica.serializer', $config['serializer']); + + $serializer = $container->getDefinition('fos_elastica.serializer_callback_prototype'); + $serializer->setClass($config['callback_class']); + + $callbackClassImplementedInterfaces = class_implements($config['callback_class']); + if (isset($callbackClassImplementedInterfaces['Symfony\Component\DependencyInjection\ContainerAwareInterface'])) { + $serializer->addMethodCall('setContainer', array(new Reference('service_container'))); + } + } + /** * Creates a default manager alias for defined default manager or the first loaded driver. * diff --git a/Resources/config/serializer.xml b/Resources/config/serializer.xml new file mode 100644 index 0000000..8ee9646 --- /dev/null +++ b/Resources/config/serializer.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/Tests/Functional/app/ORM/bundles.php b/Tests/Functional/app/ORM/bundles.php index d0b6efb..25db3fe 100644 --- a/Tests/Functional/app/ORM/bundles.php +++ b/Tests/Functional/app/ORM/bundles.php @@ -3,9 +3,11 @@ use Doctrine\Bundle\DoctrineBundle\DoctrineBundle; use FOS\ElasticaBundle\FOSElasticaBundle; use Symfony\Bundle\FrameworkBundle\FrameworkBundle; +use JMS\SerializerBundle\JMSSerializerBundle; return array( new FrameworkBundle(), new FOSElasticaBundle(), - new DoctrineBundle() + new DoctrineBundle(), + new JMSSerializerBundle(), ); diff --git a/Tests/Functional/app/ORM/config.yml b/Tests/Functional/app/ORM/config.yml index 77e5f5b..340fa65 100644 --- a/Tests/Functional/app/ORM/config.yml +++ b/Tests/Functional/app/ORM/config.yml @@ -13,6 +13,7 @@ fos_elastica: clients: default: url: http://localhost:9200 + serializer: ~ indexes: index: index_name: foselastica_test_%kernel.environment% @@ -25,6 +26,9 @@ fos_elastica: model: FOS\ElasticaBundle\Tests\Functional\TypeObj listener: is_indexable_callback: 'object.isIndexable() && !object.isntIndexable()' + serializer: + groups: ['search'] + version: 1.1 type2: properties: field1: ~ diff --git a/Transformer/ModelToElasticaIdentifierTransformer.php b/Transformer/ModelToElasticaIdentifierTransformer.php index 654850f..7cf97e6 100644 --- a/Transformer/ModelToElasticaIdentifierTransformer.php +++ b/Transformer/ModelToElasticaIdentifierTransformer.php @@ -21,6 +21,7 @@ class ModelToElasticaIdentifierTransformer extends ModelToElasticaAutoTransforme public function transform($object, array $fields) { $identifier = $this->propertyAccessor->getValue($object, $this->options['identifier']); + return new Document($identifier); } } diff --git a/composer.json b/composer.json index bde8b3e..b65e0b2 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "doctrine/orm": "~2.2", "doctrine/doctrine-bundle": "~1.2@beta", "doctrine/mongodb-odm": "1.0.*@beta", + "jms/serializer-bundle": "@stable", "phpunit/phpunit": "~4.1", "propel/propel1": "1.6.*", "pagerfanta/pagerfanta": "1.0.*@dev",