123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- <?php
- namespace Doctrine\Persistence\Mapping\Driver;
- use Doctrine\Persistence\Mapping\ClassMetadata;
- use Doctrine\Persistence\Mapping\MappingException;
- use function array_keys;
- use function assert;
- use function spl_object_hash;
- use function strpos;
- /**
- * The DriverChain allows you to add multiple other mapping drivers for
- * certain namespaces.
- */
- class MappingDriverChain implements MappingDriver
- {
- /**
- * The default driver.
- *
- * @var MappingDriver|null
- */
- private $defaultDriver;
- /** @var MappingDriver[] */
- private $drivers = [];
- /**
- * Gets the default driver.
- *
- * @return MappingDriver|null
- */
- public function getDefaultDriver()
- {
- return $this->defaultDriver;
- }
- /**
- * Set the default driver.
- *
- * @return void
- */
- public function setDefaultDriver(MappingDriver $driver)
- {
- $this->defaultDriver = $driver;
- }
- /**
- * Adds a nested driver.
- *
- * @param string $namespace
- *
- * @return void
- */
- public function addDriver(MappingDriver $nestedDriver, $namespace)
- {
- $this->drivers[$namespace] = $nestedDriver;
- }
- /**
- * Gets the array of nested drivers.
- *
- * @return MappingDriver[] $drivers
- */
- public function getDrivers()
- {
- return $this->drivers;
- }
- /**
- * {@inheritDoc}
- */
- public function loadMetadataForClass($className, ClassMetadata $metadata)
- {
- foreach ($this->drivers as $namespace => $driver) {
- assert($driver instanceof MappingDriver);
- if (strpos($className, $namespace) === 0) {
- $driver->loadMetadataForClass($className, $metadata);
- return;
- }
- }
- if ($this->defaultDriver !== null) {
- $this->defaultDriver->loadMetadataForClass($className, $metadata);
- return;
- }
- throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers));
- }
- /**
- * {@inheritDoc}
- */
- public function getAllClassNames()
- {
- $classNames = [];
- $driverClasses = [];
- foreach ($this->drivers as $namespace => $driver) {
- assert($driver instanceof MappingDriver);
- $oid = spl_object_hash($driver);
- if (! isset($driverClasses[$oid])) {
- $driverClasses[$oid] = $driver->getAllClassNames();
- }
- foreach ($driverClasses[$oid] as $className) {
- if (strpos($className, $namespace) !== 0) {
- continue;
- }
- $classNames[$className] = true;
- }
- }
- if ($this->defaultDriver !== null) {
- foreach ($this->defaultDriver->getAllClassNames() as $className) {
- $classNames[$className] = true;
- }
- }
- return array_keys($classNames);
- }
- /**
- * {@inheritDoc}
- */
- public function isTransient($className)
- {
- foreach ($this->drivers as $namespace => $driver) {
- assert($driver instanceof MappingDriver);
- if (strpos($className, $namespace) === 0) {
- return $driver->isTransient($className);
- }
- }
- if ($this->defaultDriver !== null) {
- return $this->defaultDriver->isTransient($className);
- }
- return true;
- }
- }
|