. */ namespace Doctrine\Common\Persistence\Mapping\Driver; use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, Doctrine\Common\Persistence\Mapping\ClassMetadata, Doctrine\Common\Persistence\Mapping\MappingException; /** * The DriverChain allows you to add multiple other mapping drivers for * certain namespaces * * @since 2.2 * @author Benjamin Eberlei * @author Guilherme Blanco * @author Jonathan H. Wage * @author Roman Borschel */ class MappingDriverChain implements MappingDriver { /** * @var array */ private $drivers = array(); /** * Add a nested driver. * * @param Driver $nestedDriver * @param string $namespace */ public function addDriver(MappingDriver $nestedDriver, $namespace) { $this->drivers[$namespace] = $nestedDriver; } /** * Get the array of nested drivers. * * @return array $drivers */ public function getDrivers() { return $this->drivers; } /** * Loads the metadata for the specified class into the provided container. * * @param string $className * @param ClassMetadataInfo $metadata */ public function loadMetadataForClass($className, ClassMetadata $metadata) { foreach ($this->drivers as $namespace => $driver) { if (strpos($className, $namespace) === 0) { $driver->loadMetadataForClass($className, $metadata); return; } } throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); } /** * Gets the names of all mapped classes known to this driver. * * @return array The names of all mapped classes known to this driver. */ public function getAllClassNames() { $classNames = array(); $driverClasses = array(); foreach ($this->drivers AS $namespace => $driver) { $oid = spl_object_hash($driver); if (!isset($driverClasses[$oid])) { $driverClasses[$oid] = $driver->getAllClassNames(); } foreach ($driverClasses[$oid] AS $className) { if (strpos($className, $namespace) === 0) { $classNames[$className] = true; } } } return array_keys($classNames); } /** * Whether the class with the specified name should have its metadata loaded. * * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. * * @param string $className * @return boolean */ public function isTransient($className) { foreach ($this->drivers AS $namespace => $driver) { if (strpos($className, $namespace) === 0) { return $driver->isTransient($className); } } // class isTransient, i.e. not an entity or mapped superclass return true; } }