X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fsymfony%2Fserializer%2FNormalizer%2FPropertyNormalizer.php;fp=vendor%2Fsymfony%2Fserializer%2FNormalizer%2FPropertyNormalizer.php;h=52dc4f4a52dcc424512ff1fe99aa828c4a3360dc;hp=9795ec4bc85e983a78b4c1083576e7f8340077ee;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php b/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php index 9795ec4bc..52dc4f4a5 100644 --- a/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php @@ -30,12 +30,14 @@ namespace Symfony\Component\Serializer\Normalizer; */ class PropertyNormalizer extends AbstractObjectNormalizer { + private $cache = array(); + /** * {@inheritdoc} */ public function supportsNormalization($data, $format = null) { - return parent::supportsNormalization($data, $format) && $this->supports(get_class($data)); + return parent::supportsNormalization($data, $format) && (isset($this->cache[$type = \get_class($data)]) ? $this->cache[$type] : $this->cache[$type] = $this->supports($type)); } /** @@ -43,7 +45,7 @@ class PropertyNormalizer extends AbstractObjectNormalizer */ public function supportsDenormalization($data, $type, $format = null) { - return parent::supportsDenormalization($data, $type, $format) && $this->supports($type); + return parent::supportsDenormalization($data, $type, $format) && (isset($this->cache[$type]) ? $this->cache[$type] : $this->cache[$type] = $this->supports($type)); } /** @@ -58,11 +60,13 @@ class PropertyNormalizer extends AbstractObjectNormalizer $class = new \ReflectionClass($class); // We look for at least one non-static property - foreach ($class->getProperties() as $property) { - if (!$property->isStatic()) { - return true; + do { + foreach ($class->getProperties() as $property) { + if (!$property->isStatic()) { + return true; + } } - } + } while ($class = $class->getParentClass()); return false; } @@ -77,7 +81,7 @@ class PropertyNormalizer extends AbstractObjectNormalizer } try { - $reflectionProperty = new \ReflectionProperty(is_string($classOrObject) ? $classOrObject : get_class($classOrObject), $attribute); + $reflectionProperty = $this->getReflectionProperty($classOrObject, $attribute); if ($reflectionProperty->isStatic()) { return false; } @@ -96,13 +100,15 @@ class PropertyNormalizer extends AbstractObjectNormalizer $reflectionObject = new \ReflectionObject($object); $attributes = array(); - foreach ($reflectionObject->getProperties() as $property) { - if (!$this->isAllowedAttribute($object, $property->name)) { - continue; - } + do { + foreach ($reflectionObject->getProperties() as $property) { + if (!$this->isAllowedAttribute($reflectionObject->getName(), $property->name)) { + continue; + } - $attributes[] = $property->name; - } + $attributes[] = $property->name; + } + } while ($reflectionObject = $reflectionObject->getParentClass()); return $attributes; } @@ -113,7 +119,7 @@ class PropertyNormalizer extends AbstractObjectNormalizer protected function getAttributeValue($object, $attribute, $format = null, array $context = array()) { try { - $reflectionProperty = new \ReflectionProperty(get_class($object), $attribute); + $reflectionProperty = $this->getReflectionProperty($object, $attribute); } catch (\ReflectionException $reflectionException) { return; } @@ -132,7 +138,7 @@ class PropertyNormalizer extends AbstractObjectNormalizer protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = array()) { try { - $reflectionProperty = new \ReflectionProperty(get_class($object), $attribute); + $reflectionProperty = $this->getReflectionProperty($object, $attribute); } catch (\ReflectionException $reflectionException) { return; } @@ -148,4 +154,26 @@ class PropertyNormalizer extends AbstractObjectNormalizer $reflectionProperty->setValue($object, $value); } + + /** + * @param string|object $classOrObject + * @param string $attribute + * + * @return \ReflectionProperty + * + * @throws \ReflectionException + */ + private function getReflectionProperty($classOrObject, $attribute) + { + $reflectionClass = new \ReflectionClass($classOrObject); + while (true) { + try { + return $reflectionClass->getProperty($attribute); + } catch (\ReflectionException $e) { + if (!$reflectionClass = $reflectionClass->getParentClass()) { + throw $e; + } + } + } + } }