143 lines
3.2 KiB
PHP
143 lines
3.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Doctrine\Persistence\Mapping\Driver;
|
|
|
|
use Doctrine\Persistence\Mapping\ClassMetadata;
|
|
use Doctrine\Persistence\Mapping\MappingException;
|
|
|
|
use function array_keys;
|
|
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 array<string, 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.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addDriver(MappingDriver $nestedDriver, string $namespace)
|
|
{
|
|
$this->drivers[$namespace] = $nestedDriver;
|
|
}
|
|
|
|
/**
|
|
* Gets the array of nested drivers.
|
|
*
|
|
* @return array<string, MappingDriver> $drivers
|
|
*/
|
|
public function getDrivers()
|
|
{
|
|
return $this->drivers;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function loadMetadataForClass(string $className, ClassMetadata $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::classNotFoundInNamespaces($className, array_keys($this->drivers));
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function getAllClassNames()
|
|
{
|
|
$classNames = [];
|
|
$driverClasses = [];
|
|
|
|
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) {
|
|
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(string $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);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|