diff --git a/DependencyInjection/FOSElasticaExtension.php b/DependencyInjection/FOSElasticaExtension.php index c28fb99..9a15a83 100644 --- a/DependencyInjection/FOSElasticaExtension.php +++ b/DependencyInjection/FOSElasticaExtension.php @@ -16,6 +16,7 @@ class FOSElasticaExtension extends Extension protected $indexConfigs = array(); protected $typeFields = array(); protected $loadedDrivers = array(); + protected $serializerConfig = array(); public function load(array $configs, ContainerBuilder $container) { @@ -40,8 +41,8 @@ class FOSElasticaExtension extends Extension } $clientIdsByName = $this->loadClients($config['clients'], $container); - $serializerConfig = isset($config['serializer']) ? $config['serializer'] : null; - $indexIdsByName = $this->loadIndexes($config['indexes'], $container, $clientIdsByName, $config['default_client'], $serializerConfig); + $this->serializerConfig = isset($config['serializer']) ? $config['serializer'] : null; + $indexIdsByName = $this->loadIndexes($config['indexes'], $container, $clientIdsByName, $config['default_client']); $indexRefsByName = array_map(function($id) { return new Reference($id); }, $indexIdsByName); @@ -94,7 +95,7 @@ class FOSElasticaExtension extends Extension * @throws \InvalidArgumentException * @return array */ - protected function loadIndexes(array $indexes, ContainerBuilder $container, array $clientIdsByName, $defaultClientName, $serializerConfig) + protected function loadIndexes(array $indexes, ContainerBuilder $container, array $clientIdsByName, $defaultClientName) { $indexIds = array(); foreach ($indexes as $name => $index) { @@ -129,7 +130,7 @@ class FOSElasticaExtension extends Extension if (!empty($index['settings'])) { $this->indexConfigs[$name]['config']['settings'] = $index['settings']; } - $this->loadTypes(isset($index['types']) ? $index['types'] : array(), $container, $name, $indexId, $typePrototypeConfig, $serializerConfig); + $this->loadTypes(isset($index['types']) ? $index['types'] : array(), $container, $name, $indexId, $typePrototypeConfig); } return $indexIds; @@ -170,7 +171,7 @@ class FOSElasticaExtension extends Extension * @param $indexId * @param array $typePrototypeConfig */ - protected function loadTypes(array $types, ContainerBuilder $container, $indexName, $indexId, array $typePrototypeConfig, $serializerConfig) + protected function loadTypes(array $types, ContainerBuilder $container, $indexName, $indexId, array $typePrototypeConfig) { foreach ($types as $name => $type) { $type = self::deepArrayUnion($typePrototypeConfig, $type); @@ -179,12 +180,12 @@ class FOSElasticaExtension extends Extension $typeDef = new Definition('%fos_elastica.type.class%', $typeDefArgs); $typeDef->setFactoryService($indexId); $typeDef->setFactoryMethod('getType'); - if ($serializerConfig) { - $callbackDef = new Definition($serializerConfig['callback_class']); + if ($this->serializerConfig) { + $callbackDef = new Definition($this->serializerConfig['callback_class']); $callbackId = sprintf('%s.%s.serializer.callback', $indexId, $name); $typeDef->addMethodCall('setSerializer', array(array(new Reference($callbackId), 'serialize'))); - $callbackDef->addMethodCall('setSerializer', array(new Reference($serializerConfig['serializer']))); + $callbackDef->addMethodCall('setSerializer', array(new Reference($this->serializerConfig['serializer']))); if (isset($type['serializer']['groups'])) { $callbackDef->addMethodCall('setGroups', array($type['serializer']['groups'])); } @@ -307,7 +308,11 @@ class FOSElasticaExtension extends Extension if (isset($typeConfig['model_to_elastica_transformer']['service'])) { return $typeConfig['model_to_elastica_transformer']['service']; } - $abstractId = sprintf('fos_elastica.model_to_elastica_transformer.prototype.auto'); + if ($this->serializerConfig) { + $abstractId = sprintf('fos_elastica.model_to_elastica_transformer.prototype.identifier'); + } else { + $abstractId = sprintf('fos_elastica.model_to_elastica_transformer.prototype.auto'); + } $serviceId = sprintf('fos_elastica.model_to_elastica_transformer.%s.%s', $indexName, $typeName); $serviceDef = new DefinitionDecorator($abstractId); $serviceDef->replaceArgument(0, array( @@ -320,13 +325,27 @@ class FOSElasticaExtension extends Extension protected function loadObjectPersister(array $typeConfig, Definition $typeDef, ContainerBuilder $container, $indexName, $typeName, $transformerId) { - $abstractId = sprintf('fos_elastica.object_persister.prototype'); + if ($this->serializerConfig) { + $abstractId = sprintf('fos_elastica.object_serializer_persister.prototype'); + $arguments = array( + $typeDef, + new Reference($transformerId), + $typeConfig['model'], + ); + } else { + $abstractId = sprintf('fos_elastica.object_persister.prototype'); + $arguments = array( + $typeDef, + new Reference($transformerId), + $typeConfig['model'], + $this->typeFields[sprintf('%s/%s', $indexName, $typeName)], + ); + } $serviceId = sprintf('fos_elastica.object_persister.%s.%s', $indexName, $typeName); $serviceDef = new DefinitionDecorator($abstractId); - $serviceDef->replaceArgument(0, $typeDef); - $serviceDef->replaceArgument(1, new Reference($transformerId)); - $serviceDef->replaceArgument(2, $typeConfig['model']); - $serviceDef->replaceArgument(3, $this->typeFields[sprintf('%s/%s', $indexName, $typeName)]); + foreach ($arguments as $i => $argument) { + $serviceDef->replaceArgument($i, $argument); + } $container->setDefinition($serviceId, $serviceDef); return $serviceId; diff --git a/Persister/ObjectSerializerPersister.php b/Persister/ObjectSerializerPersister.php new file mode 100644 index 0000000..db8122a --- /dev/null +++ b/Persister/ObjectSerializerPersister.php @@ -0,0 +1,97 @@ + + */ +class ObjectSerializerPersister extends ObjectPersister +{ + public function __construct(Type $type, ModelToElasticaTransformerInterface $transformer, $objectClass) + { + $this->type = $type; + $this->transformer = $transformer; + $this->objectClass = $objectClass; + } + + /** + * Insert one object into the type + * The object will be transformed to an elastica document + * + * @param object $object + */ + public function insertOne($object) + { + $document = $this->transformToElasticaDocument($object); + $this->type->addObject($object, $document); + } + + /** + * Replaces one object in the type + * + * @param object $object + * @return null + **/ + public function replaceOne($object) + { + $document = $this->transformToElasticaDocument($object); + $this->type->deleteById($document->getId()); + $this->type->addObject($object, $document); + } + + /** + * Deletes one object in the type + * + * @param object $object + * @return null + **/ + public function deleteOne($object) + { + $document = $this->transformToElasticaDocument($object); + $this->type->deleteById($document->getId()); + } + + /** + * Deletes one object in the type by id + * + * @param mixed $id + * + * @return null + **/ + public function deleteById($id) + { + $this->type->deleteById($id); + } + + + /** + * Inserts an array of objects in the type + * + * @param array $objects array of domain model objects + **/ + public function insertMany(array $objects) + { + foreach ($objects as $object) { + $this->insertOne($object); + } + } + + /** + * Transforms an object to an elastica document + * with just the identifier set + * + * @param object $object + * @return Document the elastica document + */ + public function transformToElasticaDocument($object) + { + return $this->transformer->transform($object, array()); + } +} diff --git a/Resources/config/config.xml b/Resources/config/config.xml index 4097289..3f5f7cf 100644 --- a/Resources/config/config.xml +++ b/Resources/config/config.xml @@ -52,6 +52,12 @@ + + + + + + @@ -64,6 +70,13 @@ + + + + + + + diff --git a/Transformer/ModelToElasticaIdentifierTransformer.php b/Transformer/ModelToElasticaIdentifierTransformer.php new file mode 100644 index 0000000..416eaf7 --- /dev/null +++ b/Transformer/ModelToElasticaIdentifierTransformer.php @@ -0,0 +1,26 @@ +propertyAccessor->getValue($object, $this->options['identifier']); + return new Document($identifier); + } +}