Fix serializer
This commit is contained in:
parent
4e990e0cee
commit
ca6991d494
|
@ -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.
|
||||
*
|
||||
|
|
14
Resources/config/serializer.xml
Normal file
14
Resources/config/serializer.xml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<container xmlns="http://symfony.com/schema/dic/services"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
|
||||
|
||||
<services>
|
||||
<service id="fos_elastica.serializer_callback_prototype" public="false" abstract="true">
|
||||
<call method="setSerializer">
|
||||
<argument type="service" id="fos_elastica.serializer" />
|
||||
</call>
|
||||
</service>
|
||||
</services>
|
||||
</container>
|
|
@ -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(),
|
||||
);
|
||||
|
|
|
@ -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: ~
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue