/** * {@inheritdoc} */ public function getMetadataFor($value) { $class = $this->getClass($value); if (empty($class)) { throw InvalidArgumentException::create(InvalidArgumentException::VALUE_IS_NOT_AN_OBJECT, $value); } if (isset($this->loadedClasses[$class])) { return $this->loadedClasses[$class]; } if (null !== $this->cache && ($this->loadedClasses[$class] = $this->cache->fetch($class))) { return $this->loadedClasses[$class]; } if (!class_exists($class) && !interface_exists($class)) { throw InvalidArgumentException::create(InvalidArgumentException::CLASS_DOES_NOT_EXIST, $class); } $reflectionClass = new \ReflectionClass($class); $classMetadata = $this->createMetadata($reflectionClass); if (!$this->loader->loadClassMetadata($classMetadata)) { return $classMetadata; } $this->mergeSuperclasses($classMetadata); $this->validate($classMetadata); if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(ClassMetadataLoadedEvent::LOADED_EVENT, new ClassMetadataLoadedEvent($classMetadata)); } if (null !== $this->cache) { $this->cache->save($class, $classMetadata); } return $this->loadedClasses[$class] = $classMetadata; }
/** * Set the metadata class to be created by this factory * * @param string $metadataClass */ public function setMetadataClass($metadataClass) { if (!class_exists($metadataClass) || !is_subclass_of($metadataClass, 'Kcs\\Metadata\\ClassMetadataInterface', true)) { throw InvalidArgumentException::create(InvalidArgumentException::INVALID_METADATA_CLASS, $metadataClass); } $this->metadataClass = $metadataClass; }
/** * Register a processor class for $class * * @param string $class * @param string $processorClass */ public function registerProcessor($class, $processorClass) { if (!is_subclass_of($processorClass, 'Kcs\\Metadata\\Loader\\Processor\\ProcessorInterface', true)) { throw InvalidArgumentException::create(InvalidArgumentException::INVALID_PROCESSOR_INTERFACE_CLASS, $processorClass); } if (!isset($this->processors[$class])) { $this->processors[$class] = $processorClass; } elseif (!is_array($this->processors[$class])) { $this->processors[$class] = [$this->processors[$class], $processorClass]; } else { $this->processors[$class][] = $processorClass; } }
/** * {@inheritdoc} */ public function merge(MetadataInterface $metadata) { if ($metadata instanceof NullMetadata) { return; } if (!$metadata instanceof ClassMetadataInterface) { throw InvalidArgumentException::create(InvalidArgumentException::NOT_MERGEABLE_METADATA, $this, $metadata); } if (!$this->getReflectionClass()->isSubclassOf($metadata->getReflectionClass()->name)) { throw InvalidArgumentException::create(InvalidArgumentException::NOT_MERGEABLE_METADATA, $this->getReflectionClass()->name, $metadata->getReflectionClass()->name); } $otherAttributes = $metadata->getAttributesMetadata(); foreach ($otherAttributes as $attrName => $attrMetadata) { $target = $this->getAttributeMetadata($attrName); if ($target instanceof NullMetadata) { $this->attributesMetadata[$attrName] = $attrMetadata; continue; } $target->merge($attrMetadata); } }