Ver código fonte

added metadata cache

Johannes Schmitt 14 anos atrás
pai
commit
d5e3a1ff8b

+ 20 - 0
DependencyInjection/Configuration.php

@@ -23,6 +23,13 @@ use Symfony\Component\Config\Definition\ConfigurationInterface;
 
 
 class Configuration implements ConfigurationInterface
 class Configuration implements ConfigurationInterface
 {
 {
+    private $debug;
+
+    public function __construct($debug = false)
+    {
+        $this->debug = $debug;
+    }
+
     public function getConfigTreeBuilder()
     public function getConfigTreeBuilder()
     {
     {
         $tb = new TreeBuilder();
         $tb = new TreeBuilder();
@@ -46,6 +53,19 @@ class Configuration implements ConfigurationInterface
                             ->booleanNode('normalizable_support')->defaultTrue()->end()
                             ->booleanNode('normalizable_support')->defaultTrue()->end()
                         ->end()
                         ->end()
                     ->end()
                     ->end()
+                    ->arrayNode('metadata')
+                        ->addDefaultsIfNotSet()
+                        ->children()
+                            ->scalarNode('cache')->defaultValue('file')->end()
+                            ->booleanNode('debug')->defaultValue($this->debug)->end()
+                            ->arrayNode('file_cache')
+                                ->addDefaultsIfNotSet()
+                                ->children()
+                                    ->scalarNode('dir')->defaultValue('%kernel.cache_dir%/serializer')
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
                 ->end()
                 ->end()
             ->end()
             ->end()
         ;
         ;

+ 28 - 3
DependencyInjection/JMSSerializerExtension.php

@@ -18,6 +18,8 @@
 
 
 namespace JMS\SerializerBundle\DependencyInjection;
 namespace JMS\SerializerBundle\DependencyInjection;
 
 
+use Symfony\Component\DependencyInjection\Alias;
+
 use Symfony\Component\DependencyInjection\DefinitionDecorator;
 use Symfony\Component\DependencyInjection\DefinitionDecorator;
 use JMS\SerializerBundle\Exception\RuntimeException;
 use JMS\SerializerBundle\Exception\RuntimeException;
 use Symfony\Component\Config\FileLocator;
 use Symfony\Component\Config\FileLocator;
@@ -31,7 +33,7 @@ class JMSSerializerExtension extends Extension
 {
 {
     public function load(array $configs, ContainerBuilder $container)
     public function load(array $configs, ContainerBuilder $container)
     {
     {
-        $config = $this->mergeConfigs($configs);
+        $config = $this->mergeConfigs($configs, $container->getParameter('kernel.debug'));
         $loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config/')));
         $loader = new XmlFileLoader($container, new FileLocator(array(__DIR__.'/../Resources/config/')));
         $loader->load('services.xml');
         $loader->load('services.xml');
 
 
@@ -58,6 +60,29 @@ class JMSSerializerExtension extends Extension
             ;
             ;
         }
         }
 
 
+        // metadata
+        if ('none' === $config['metadata']['cache']) {
+            $container->removeAlias('jms_serializer.metadata.cache');
+        } else if ('file' === $config['metadata']['cache']) {
+            $container
+                ->getDefinition('jms_serializer.metadata.cache.file_cache')
+                ->replaceArgument(0, $config['metadata']['file_cache']['dir'])
+            ;
+
+            $dir = $container->getParameterBag()->resolveValue($config['metadata']['file_cache']['dir']);
+            if (!file_exists($dir)) {
+                if (!$rs = @mkdir($dir, 0777, true)) {
+                    throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $dir));
+                }
+            }
+        } else {
+            $container->setAlias('jms_serializer.metadata.cache', new Alias($config['metadata']['cache'], false));
+        }
+        $container
+            ->getDefinition('jms_serializer.metadata.metadata_factory')
+            ->replaceArgument(2, $config['metadata']['debug'])
+        ;
+
         // versions
         // versions
         if ($config['versions']) {
         if ($config['versions']) {
             $serializers = array();
             $serializers = array();
@@ -124,10 +149,10 @@ class JMSSerializerExtension extends Extension
         }
         }
     }
     }
 
 
-    private function mergeConfigs(array $configs)
+    private function mergeConfigs(array $configs, $debug)
     {
     {
         $processor = new Processor();
         $processor = new Processor();
-        $config = new Configuration();
+        $config = new Configuration($debug);
 
 
         return $processor->process($config->getConfigTreeBuilder()->buildTree(), $configs);
         return $processor->process($config->getConfigTreeBuilder()->buildTree(), $configs);
     }
     }

+ 10 - 0
Resources/config/services.xml

@@ -8,6 +8,7 @@
         <parameter key="jms_serializer.metadata.driver.annotation_driver.class">JMS\SerializerBundle\Metadata\Driver\AnnotationDriver</parameter>
         <parameter key="jms_serializer.metadata.driver.annotation_driver.class">JMS\SerializerBundle\Metadata\Driver\AnnotationDriver</parameter>
         
         
         <parameter key="jms_serializer.metadata.metadata_factory.class">Metadata\MetadataFactory</parameter>
         <parameter key="jms_serializer.metadata.metadata_factory.class">Metadata\MetadataFactory</parameter>
+        <parameter key="jms_serializer.metadata.cache.file_cache.class">Metadata\Cache\FileCache</parameter>
     
     
         <parameter key="jms_serializer.camel_case_naming_strategy.class">JMS\SerializerBundle\Serializer\Naming\CamelCaseNamingStrategy</parameter>
         <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.serialized_name_annotation_strategy.class">JMS\SerializerBundle\Serializer\Naming\SerializedNameAnnotationStrategy</parameter>
@@ -41,8 +42,17 @@
         <service id="jms_serializer.metadata_driver" alias="jms_serializer.metadata.driver.annotation_driver" public="false" />
         <service id="jms_serializer.metadata_driver" alias="jms_serializer.metadata.driver.annotation_driver" public="false" />
 
 
         <!-- Metadata Factory -->
         <!-- Metadata Factory -->
+        <service id="jms_serializer.metadata.cache.file_cache" class="%jms_serializer.metadata.cache.file_cache.class%" public="false">
+            <argument /><!-- Directory -->
+        </service>
+        <service id="jms_serializer.metadata.cache" alias="jms_serializer.metadata.cache.file_cache" public="false" />
         <service id="jms_serializer.metadata.metadata_factory" class="%jms_serializer.metadata.metadata_factory.class%" public="false">
         <service id="jms_serializer.metadata.metadata_factory" class="%jms_serializer.metadata.metadata_factory.class%" public="false">
             <argument type="service" id="jms_serializer.metadata_driver" />
             <argument type="service" id="jms_serializer.metadata_driver" />
+            <argument>Metadata\ClassHierarchyMetadata</argument>
+            <argument />
+            <call method="setCache">
+                <argument type="service" id="jms_serializer.metadata.cache" on-invalid="ignore" />
+            </call>
         </service>
         </service>
 
 
         <!-- Exclusion Strategies -->
         <!-- Exclusion Strategies -->

+ 20 - 0
Tests/DependencyInjection/JMSSerializerExtensionTest.php

@@ -15,10 +15,30 @@ use JMS\SerializerBundle\DependencyInjection\JMSSerializerExtension;
 
 
 class JMSSerializerExtensionTest extends \PHPUnit_Framework_TestCase
 class JMSSerializerExtensionTest extends \PHPUnit_Framework_TestCase
 {
 {
+    protected function tearDown()
+    {
+        // clear temporary directory
+        $dir = sys_get_temp_dir().'/serializer';
+        if (is_dir($dir)) {
+            foreach (new \RecursiveDirectoryIterator($dir) as $file) {
+                $filename = $file->getFileName();
+                if ('.' === $filename || '..' === $filename) {
+                    continue;
+                }
+
+                @unlink($file->getPathName());
+            }
+
+            @rmdir($dir);
+        }
+    }
+
     public function testLoad()
     public function testLoad()
     {
     {
         $extension = new JMSSerializerExtension();
         $extension = new JMSSerializerExtension();
         $container = new ContainerBuilder();
         $container = new ContainerBuilder();
+        $container->setParameter('kernel.debug', true);
+        $container->setParameter('kernel.cache_dir', sys_get_temp_dir());
         $container->set('annotation_reader', new Reader());
         $container->set('annotation_reader', new Reader());
         $container->set('service_container', $container);
         $container->set('service_container', $container);
         $extension->load(array(array(
         $extension->load(array(array(