You are here

public function ClassMetadataFactory::getMetadataFor in Zircon Profile 8

Same name in this branch
  1. 8 vendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php \Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory::getMetadataFor()
  2. 8 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php \Doctrine\Common\Persistence\Mapping\ClassMetadataFactory::getMetadataFor()
Same name and namespace in other branches
  1. 8.0 vendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php \Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory::getMetadataFor()

If the method was called with the same class name (or an object of that class) before, the same metadata instance is returned.

If the factory was configured with a cache, this method will first look for an existing metadata instance in the cache. If an existing instance is found, it will be returned without further ado.

Otherwise, a new metadata instance is created. If the factory was configured with a loader, the metadata is passed to the {@link \Symfony\Component\Serializer\Mapping\Loader\LoaderInterface::loadClassMetadata()} method for further configuration. At last, the new object is returned.

Parameters

string|object $value:

Return value

ClassMetadataInterface

Throws

InvalidArgumentException

Overrides ClassMetadataFactoryInterface::getMetadataFor

File

vendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php, line 52

Class

ClassMetadataFactory
Returns a {@link ClassMetadata}.

Namespace

Symfony\Component\Serializer\Mapping\Factory

Code

public function getMetadataFor($value) {
  $class = $this
    ->getClass($value);
  if (!$class) {
    throw new InvalidArgumentException(sprintf('Cannot create metadata for non-objects. Got: "%s"', gettype($value)));
  }
  if (isset($this->loadedClasses[$class])) {
    return $this->loadedClasses[$class];
  }
  if ($this->cache && ($this->loadedClasses[$class] = $this->cache
    ->fetch($class))) {
    return $this->loadedClasses[$class];
  }
  if (!class_exists($class) && !interface_exists($class)) {
    throw new InvalidArgumentException(sprintf('The class or interface "%s" does not exist.', $class));
  }
  $classMetadata = new ClassMetadata($class);
  $this->loader
    ->loadClassMetadata($classMetadata);
  $reflectionClass = $classMetadata
    ->getReflectionClass();

  // Include metadata from the parent class
  if ($parent = $reflectionClass
    ->getParentClass()) {
    $classMetadata
      ->merge($this
      ->getMetadataFor($parent->name));
  }

  // Include metadata from all implemented interfaces
  foreach ($reflectionClass
    ->getInterfaces() as $interface) {
    $classMetadata
      ->merge($this
      ->getMetadataFor($interface->name));
  }
  if ($this->cache) {
    $this->cache
      ->save($class, $classMetadata);
  }
  return $this->loadedClasses[$class] = $classMetadata;
}