. */ namespace Doctrine\ORM\Mapping\Driver; use Doctrine\ORM\Mapping\Driver\Driver, Doctrine\ORM\Mapping\ClassMetadataInfo, Doctrine\ORM\Mapping\MappingException; /** * The DriverChain allows you to add multiple other mapping drivers for * certain namespaces * * @since 2.0 * @author Benjamin Eberlei * @author Guilherme Blanco * @author Jonathan H. Wage * @author Roman Borschel * @todo Rename: MappingDriverChain or MetadataDriverChain */ class DriverChain implements Driver { /** * @var array */ private $drivers = array(); /** * The default driver * * @var Driver */ private $defaultDriver; /** * Get the default driver. * * @return Driver */ public function getDefaultDriver() { return $this->defaultDriver; } /** * Set the default driver. * * @param Driver $driver */ public function setDefaultDriver(Driver $driver) { $this->defaultDriver = $driver; } /** * Add a nested driver. * * @param Driver $nestedDriver * @param string $namespace */ public function addDriver(Driver $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, ClassMetadataInfo $metadata) { foreach ($this->drivers as $namespace => $driver) { if (strpos($className, $namespace) === 0) { $driver->loadMetadataForClass($className, $metadata); return; } } if ($this->defaultDriver !== null) { $this->defaultDriver->loadMetadataForClass($className, $metadata); return; } throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); } /** * 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); } } if ($this->defaultDriver !== null) { return $this->defaultDriver->isTransient($className); } // class isTransient, i.e. not an entity or mapped superclass return true; } }