Ver código fonte

Support virtual_properties key for YamlDriver, tests

Aleksandr Klimenkov 13 anos atrás
pai
commit
636fd3a949

+ 0 - 3
Metadata/Driver/XmlDriver.php

@@ -95,9 +95,6 @@ class XmlDriver extends AbstractFileDriver
             }
             
             foreach ($propertiesMetadata as $propertyKey => $pMetadata) {
-                if ($name !== $property->getDeclaringClass()->getName()) {
-                    continue;
-                }
 
                 $isExclude = $isExpose = false;
 

+ 28 - 1
Metadata/Driver/YamlDriver.php

@@ -22,6 +22,7 @@ use JMS\SerializerBundle\Exception\RuntimeException;
 use JMS\SerializerBundle\Annotation\ExclusionPolicy;
 use Metadata\MethodMetadata;
 use JMS\SerializerBundle\Metadata\PropertyMetadata;
+use JMS\SerializerBundle\Metadata\VirtualPropertyMetadata;
 use JMS\SerializerBundle\Metadata\ClassMetadata;
 use Symfony\Component\Yaml\Yaml;
 use Metadata\Driver\AbstractFileDriver;
@@ -44,6 +45,8 @@ class YamlDriver extends AbstractFileDriver
         $excludeAll = isset($config['exclude']) ? (Boolean) $config['exclude'] : false;
         $classAccessType = isset($config['access_type']) ? $config['access_type'] : PropertyMetadata::ACCESS_TYPE_PROPERTY;
 
+        $propertiesMetadata = array();
+
         if (isset($config['accessor_order'])) {
             $metadata->setAccessorOrder($config['accessor_order'], isset($config['custom_accessor_order']) ? $config['custom_accessor_order'] : array());
         }
@@ -52,13 +55,37 @@ class YamlDriver extends AbstractFileDriver
             $metadata->xmlRootName = (string) $config['xml_root_name'];
         }
 
+        if (array_key_exists('virtual_properties', $config) ) {
+
+            foreach ( $config['virtual_properties'] as $propertyName => $propertySettings ) {
+
+                if (!array_key_exists('method', $propertySettings)) {
+                    throw new RuntimeException('The method must be set for all virtual_property elements');
+                }
+
+                if ( !$class->hasMethod( $propertySettings['method'] ) ) {
+                    throw new RuntimeException('The method '.$propertySettings['method'].' not found in class ' . $class->name);
+                }
+
+                $virtualPropertyMetadata = new VirtualPropertyMetadata( $name, $propertyName );
+                $virtualPropertyMetadata->getter = (string) $propertySettings['method'];
+
+                $propertiesMetadata[$propertyName] = $virtualPropertyMetadata;
+                $config['properties'][$propertyName] = $propertySettings;
+            }
+        }
+
         if (!$excludeAll) {
             foreach ($class->getProperties() as $property) {
                 if ($name !== $property->getDeclaringClass()->getName()) {
                     continue;
                 }
+                $pName = $property->getName();
+                $propertiesMetadata[$pName] = new PropertyMetadata($name, $pName);
+            }
+
+            foreach ($propertiesMetadata as $pName => $pMetadata) {
 
-                $pMetadata = new PropertyMetadata($name, $pName = $property->getName());
                 $isExclude = $isExpose = false;
                 if (isset($config['properties'][$pName])) {
                     $pConfig = $config['properties'][$pName];

+ 17 - 0
Tests/Metadata/Driver/BaseDriverTest.php

@@ -20,6 +20,7 @@ namespace JMS\SerializerBundle\Tests\Metadata\Driver;
 
 use JMS\SerializerBundle\Metadata\PropertyMetadata;
 use JMS\SerializerBundle\Metadata\ClassMetadata;
+use JMS\SerializerBundle\Metadata\VirtualPropertyMetadata;
 
 abstract class BaseDriverTest extends \PHPUnit_Framework_TestCase
 {
@@ -69,5 +70,21 @@ abstract class BaseDriverTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($p, $m->propertyMetadata['price']);
     }
 
+    public function testVirtualProperty()
+    {
+        $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\SerializerBundle\Tests\Fixtures\ObjectWithVirtualProperties'));
+
+        $this->assertArrayHasKey('existField', $m->propertyMetadata);
+        $this->assertArrayHasKey('foo', $m->propertyMetadata);
+        $this->assertArrayHasKey('prop_name', $m->propertyMetadata);
+
+        $this->assertEquals($m->propertyMetadata['prop_name']->serializedName, 'test', 'Serialized name is missing' );
+
+        $p = new VirtualPropertyMetadata($m->name, 'foo');
+        $p->getter = 'getVirtualValue';
+
+        $this->assertEquals($p, $m->propertyMetadata['foo']);
+    }
+
     abstract protected function getDriver();
 }

+ 0 - 17
Tests/Metadata/Driver/XmlDriverTest.php

@@ -20,8 +20,6 @@ namespace JMS\SerializerBundle\Tests\Metadata\Driver;
 
 use Metadata\Driver\FileLocator;
 use JMS\SerializerBundle\Metadata\PropertyMetadata;
-use JMS\SerializerBundle\Metadata\VirtualPropertyMetadata;
-
 use JMS\SerializerBundle\Metadata\Driver\XmlDriver;
 
 class XmlDriverTest extends BaseDriverTest
@@ -84,21 +82,6 @@ class XmlDriverTest extends BaseDriverTest
         $this->assertEquals($p, $m->propertyMetadata['name']);
     }
     
-    public function testVirtualProperty()
-    {
-        $m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass('JMS\SerializerBundle\Tests\Fixtures\ObjectWithVirtualProperties'));
-
-        $this->assertArrayHasKey('existField', $m->propertyMetadata);
-        $this->assertArrayHasKey('foo', $m->propertyMetadata);
-        $this->assertArrayHasKey('prop_name', $m->propertyMetadata);
-        
-        $p = new VirtualPropertyMetadata($m->name, 'foo');
-        $p->getter = 'getVirtualValue';
-
-        $this->assertEquals($p, $m->propertyMetadata['foo']);
-    }
-    
-
     protected function getDriver()
     {
         $append = '';

+ 24 - 0
Tests/Metadata/Driver/php/ObjectWithVirtualProperties.php

@@ -0,0 +1,24 @@
+<?php
+
+use JMS\SerializerBundle\Metadata\ClassMetadata;
+use JMS\SerializerBundle\Metadata\PropertyMetadata;
+use JMS\SerializerBundle\Metadata\VirtualPropertyMetadata;
+
+$className = 'JMS\SerializerBundle\Tests\Fixtures\ObjectWithVirtualProperties';
+
+$metadata = new ClassMetadata( $className );
+
+$pMetadata = new PropertyMetadata($className, 'existField');
+$metadata->addPropertyMetadata($pMetadata);
+
+$pMetadata = new VirtualPropertyMetadata($className, 'foo');
+$pMetadata->getter = 'getVirtualValue';
+$metadata->addPropertyMetadata($pMetadata);
+
+
+$pMetadata = new VirtualPropertyMetadata($className, 'prop_name');
+$pMetadata->getter = 'getVirtualSerializedValue';
+$pMetadata->serializedName = 'test';
+$metadata->addPropertyMetadata($pMetadata);
+
+return $metadata;

+ 1 - 1
Tests/Metadata/Driver/xml/ObjectWithVirtualProperties.xml

@@ -3,6 +3,6 @@
     <class name="JMS\SerializerBundle\Tests\Fixtures\ObjectWithVirtualProperties">
         <property name="existField" type="string"/>
         <virtual-property name="foo" method="getVirtualValue"/>
-        <virtual-property name="prop_name" method="getVirtualSerializedValue"/>
+        <virtual-property name="prop_name" method="getVirtualSerializedValue" serialized-name="test"/>
     </class>
 </serializer>

+ 10 - 0
Tests/Metadata/Driver/yml/ObjectWithVirtualProperties.yml

@@ -0,0 +1,10 @@
+JMS\SerializerBundle\Tests\Fixtures\ObjectWithVirtualProperties:
+    properties:
+        existField:
+            type: string
+    virtual_properties:
+        foo:
+            method: getVirtualValue
+        prop_name:
+            method: getVirtualSerializedValue
+            serialized_name: test