MetadataFactory.php 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. <?php
  2. namespace JMS\SerializerBundle\Metadata;
  3. use JMS\SerializerBundle\Metadata\Driver\DriverInterface;
  4. class MetadataFactory
  5. {
  6. private $driver;
  7. private $loadedMetadata = array();
  8. private $loadedClassMetadata = array();
  9. public function __construct(DriverInterface $driver)
  10. {
  11. $this->driver = $driver;
  12. }
  13. public function getMetadataForClass($className)
  14. {
  15. if (isset($this->loadedMetadata[$className])) {
  16. return $this->loadedMetadata[$className];
  17. }
  18. $metadata = new ClassHierarchyMetadata();
  19. foreach ($this->getClassHierarchy($className) as $class) {
  20. if (!isset($this->loadedClassMetadata[$name = $class->getName()])) {
  21. $this->loadedClassMetadata[$name] = $this->driver->loadMetadataForClass($class);
  22. }
  23. $metadata->addClass($this->loadedClassMetadata[$name]);
  24. }
  25. return $this->loadedMetadata[$className] = $metadata;
  26. }
  27. private function getClassHierarchy($class)
  28. {
  29. $refl = new \ReflectionClass($class);
  30. $classes = array();
  31. do {
  32. $classes[] = $refl;
  33. } while (false !== $refl = $refl->getParentClass());
  34. return array_reverse($classes, false);
  35. }
  36. }