Ver Fonte

improved performance by about 10%

Johannes Schmitt há 13 anos atrás
pai
commit
d5ab6cae1c

+ 1 - 0
DependencyInjection/Compiler/ConfigurationPass.php

@@ -0,0 +1 @@
+<?php

+ 1 - 0
DependencyInjection/Configuration.php

@@ -43,6 +43,7 @@ class Configuration implements ConfigurationInterface
                             ->scalarNode('id')->cannotBeEmpty()->end()
                             ->scalarNode('separator')->defaultValue('_')->end()
                             ->booleanNode('lower_case')->defaultTrue()->end()
+                            ->booleanNode('enable_cache')->defaultTrue()->end()
                         ->end()
                     ->end()
                     ->arrayNode('handlers')

+ 7 - 0
DependencyInjection/JMSSerializerExtension.php

@@ -43,6 +43,13 @@ class JMSSerializerExtension extends Extension
             ->addArgument($config['property_naming']['separator'])
             ->addArgument($config['property_naming']['lower_case'])
         ;
+        if ($config['property_naming']['enable_cache']) {
+            $container
+                ->getDefinition('jms_serializer.cache_naming_strategy')
+                ->addArgument(new Reference((string) $container->getAlias('jms_serializer.naming_strategy')))
+            ;
+            $container->setAlias('jms_serializer.naming_strategy', 'jms_serializer.cache_naming_strategy');
+        }
 
         // datetime handler
         if (isset($config['handlers']['datetime'])) {

+ 2 - 0
Resources/config/services.xml

@@ -18,6 +18,7 @@
     
         <parameter key="jms_serializer.camel_case_naming_strategy.class">JMS\SerializerBundle\Serializer\Naming\CamelCaseNamingStrategy</parameter>
         <parameter key="jms_serializer.serialized_name_annotation_strategy.class">JMS\SerializerBundle\Serializer\Naming\SerializedNameAnnotationStrategy</parameter>
+        <parameter key="jms_serializer.cache_naming_strategy.class">JMS\SerializerBundle\Serializer\Naming\CacheNamingStrategy</parameter>
 
         <parameter key="jms_serializer.unserialize_object_constructor.class">JMS\SerializerBundle\Serializer\Construction\UnserializeObjectConstructor</parameter>
 
@@ -91,6 +92,7 @@
         <service id="jms_serializer.serialized_name_annotation_strategy" class="%jms_serializer.serialized_name_annotation_strategy.class%" public="false">
             <argument type="service" id="jms_serializer.camel_case_naming_strategy" />
         </service>
+        <service id="jms_serializer.cache_naming_strategy" class="%jms_serializer.cache_naming_strategy.class%" public="false" />
         <service id="jms_serializer.naming_strategy" alias="jms_serializer.serialized_name_annotation_strategy" public="false" />
 
         <!-- Object Constructors -->

+ 26 - 0
Serializer/Naming/CacheNamingStrategy.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace JMS\SerializerBundle\Serializer\Naming;
+
+use JMS\SerializerBundle\Metadata\PropertyMetadata;
+
+class CacheNamingStrategy implements PropertyNamingStrategyInterface
+{
+    private $delegate;
+    private $cache;
+
+    public function __construct(PropertyNamingStrategyInterface $delegate)
+    {
+        $this->delegate = $delegate;
+        $this->cache = new \SplObjectStorage();
+    }
+
+    public function translateName(PropertyMetadata $property)
+    {
+        if (isset($this->cache[$property])) {
+            return $this->cache[$property];
+        }
+
+        return $this->cache[$property] = $this->delegate->translateName($property);
+    }
+}

+ 6 - 0
Tests/PerformanceTest.php

@@ -18,6 +18,10 @@
 
 namespace JMS\SerializerBundle\Tests;
 
+use Symfony\Component\Translation\MessageSelector;
+
+use Symfony\Component\Translation\IdentityTranslator;
+
 use Doctrine\Common\Annotations\AnnotationReader;
 use JMS\SerializerBundle\Exception\InvalidArgumentException;
 use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
@@ -90,8 +94,10 @@ class PerformanceTest extends \PHPUnit_Framework_TestCase
     {
         $container = new ContainerBuilder();
         $container->set('annotation_reader', new AnnotationReader());
+        $container->set('translator', new IdentityTranslator(new MessageSelector()));
         $container->setParameter('kernel.debug', true);
         $container->setParameter('kernel.cache_dir', sys_get_temp_dir());
+        $container->setParameter('kernel.bundles', array());
         $extension = new JMSSerializerExtension();
         $extension->load(array(array()), $container);