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);
+ }
+}