Skip to content

Commit

Permalink
Move sanity check to a better suited place (?)
Browse files Browse the repository at this point in the history
  • Loading branch information
mpdude committed Feb 9, 2021
1 parent 6561fab commit 0e19d61
Showing 1 changed file with 4 additions and 53 deletions.
57 changes: 4 additions & 53 deletions lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
use function count;
use function end;
use function explode;
use function in_array;
use function is_subclass_of;
use function strpos;
use function strtolower;
Expand Down Expand Up @@ -72,17 +73,8 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
private $embeddablesActiveNesting = [];

/**
* {@inheritDoc}
* @param EntityManagerInterface $em
*/
protected function loadMetadata($name)
{
$loaded = parent::loadMetadata($name);

array_map([$this, 'resolveDiscriminatorValue'], array_map([$this, 'getMetadataFor'], $loaded));

return $loaded;
}

public function setEntityManager(EntityManagerInterface $em)
{
$this->em = $em;
Expand Down Expand Up @@ -279,6 +271,8 @@ protected function validateRuntimeMetadata($class, $parent)
throw MappingException::invalidClassInDiscriminatorMap($subClass, $class->name);
}
}
} elseif ((! $class->reflClass || ! $class->reflClass->isAbstract()) && ! in_array($class->name, $parent->discriminatorMap)) {
throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName);
}
} elseif ($class->isMappedSuperclass && $class->name === $class->rootEntityName && (count($class->discriminatorMap) || $class->discriminatorColumn)) {
// second condition is necessary for mapped superclasses in the middle of an inheritance hierarchy
Expand All @@ -294,49 +288,6 @@ protected function newClassMetadataInstance($className)
return new ClassMetadata($className, $this->em->getConfiguration()->getNamingStrategy());
}

/**
* Populates the discriminator value of the given metadata (if not set) by iterating over discriminator
* map classes and looking for a fitting one.
*
* @return void
*
* @throws MappingException
*/
private function resolveDiscriminatorValue(ClassMetadata $metadata)
{
if (
$metadata->discriminatorValue
|| ! $metadata->discriminatorMap
|| $metadata->isMappedSuperclass
|| ! $metadata->reflClass
|| $metadata->reflClass->isAbstract()
) {
return;
}

// minor optimization: avoid loading related metadata when not needed
// foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) {
// if ($discriminatorClass === $metadata->name) {
// $metadata->discriminatorValue = $discriminatorValue;
//
// return;
// }
// }
//
// // iterate over discriminator mappings and resolve actual referenced classes according to existing metadata
// foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) {
// if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) {
// $metadata->discriminatorValue = $discriminatorValue;
//
// return;
// }
// }

if (! in_array($metadata->name, $metadata->discriminatorMap)) {
throw MappingException::mappedClassNotPartOfDiscriminatorMap($metadata->name, $metadata->rootEntityName);
}
}

/**
* Adds a default discriminator map if no one is given
*
Expand Down

0 comments on commit 0e19d61

Please sign in to comment.