/** * Adds a default discriminator map if no one is given * * If an entity is of any inheritance type and does not contain a * discriminator map, then the map is generated automatically. This process * is expensive computation wise. * * The automatically generated discriminator map contains the lowercase short name of * each class as key. * * @param \Doctrine\ORM\Mapping\ClassMetadata $class * * @throws MappingException */ private function addDefaultDiscriminatorMap(ClassMetadata $class) { $allClasses = $this->driver->getAllClassNames(); $fqcn = $class->getName(); $map = array($this->getShortName($class->name) => $fqcn); $duplicates = array(); foreach ($allClasses as $subClassCandidate) { if (is_subclass_of($subClassCandidate, $fqcn)) { $shortName = $this->getShortName($subClassCandidate); if (isset($map[$shortName])) { $duplicates[] = $shortName; } $map[$shortName] = $subClassCandidate; } } if ($duplicates) { throw MappingException::duplicateDiscriminatorEntry($class->name, $duplicates, $map); } $class->setDiscriminatorMap($map); }
/** * Collecting discriminator map entries from child classes for entities with inheritance not equals NONE * * @param ClassMetadata $class * @param EntityManager $em * * @throws MappingException */ protected function processDiscriminatorValues(ClassMetadata $class, EntityManager $em) { if (!$class->isInheritanceTypeNone()) { if ($class->isRootEntity()) { $allClasses = $em->getConfiguration()->getMetadataDriverImpl()->getAllClassNames(); $FQCN = $class->getName(); $map = $class->discriminatorMap ?: []; $duplicates = []; foreach ($allClasses as $subClassCandidate) { if (is_subclass_of($subClassCandidate, $FQCN) && !in_array($subClassCandidate, $map, true)) { $value = $this->getDiscriminatorValue($em->getMetadataFactory(), $subClassCandidate); if (null !== $value) { if (isset($map[$value])) { $duplicates[] = $value; } $map[$value] = $subClassCandidate; } } } if ($duplicates) { throw MappingException::duplicateDiscriminatorEntry($class->getName(), $duplicates, $map); } $class->setDiscriminatorMap($map); $this->collectedMaps = array_merge($this->collectedMaps, array_fill_keys(array_values($map), $map)); } elseif (isset($this->collectedMaps[$class->name]) && $class->discriminatorMap !== $this->collectedMaps[$class->name]) { $class->setDiscriminatorMap($this->collectedMaps[$class->name]); } } }