vendor/doctrine/persistence/lib/Doctrine/Persistence/AbstractManagerRegistry.php line 167

Open in your IDE?
  1. <?php
  2. namespace Doctrine\Persistence;
  3. use InvalidArgumentException;
  4. use ReflectionClass;
  5. use function explode;
  6. use function sprintf;
  7. use function strpos;
  8. /**
  9.  * Abstract implementation of the ManagerRegistry contract.
  10.  */
  11. abstract class AbstractManagerRegistry implements ManagerRegistry
  12. {
  13.     /** @var string */
  14.     private $name;
  15.     /** @var string[] */
  16.     private $connections;
  17.     /** @var string[] */
  18.     private $managers;
  19.     /** @var string */
  20.     private $defaultConnection;
  21.     /** @var string */
  22.     private $defaultManager;
  23.     /**
  24.      * @var string
  25.      * @psalm-var class-string
  26.      */
  27.     private $proxyInterfaceName;
  28.     /**
  29.      * @param string   $name
  30.      * @param string[] $connections
  31.      * @param string[] $managers
  32.      * @param string   $defaultConnection
  33.      * @param string   $defaultManager
  34.      * @param string   $proxyInterfaceName
  35.      * @psalm-param class-string $proxyInterfaceName
  36.      */
  37.     public function __construct($name, array $connections, array $managers$defaultConnection$defaultManager$proxyInterfaceName)
  38.     {
  39.         $this->name               $name;
  40.         $this->connections        $connections;
  41.         $this->managers           $managers;
  42.         $this->defaultConnection  $defaultConnection;
  43.         $this->defaultManager     $defaultManager;
  44.         $this->proxyInterfaceName $proxyInterfaceName;
  45.     }
  46.     /**
  47.      * Fetches/creates the given services.
  48.      *
  49.      * A service in this context is connection or a manager instance.
  50.      *
  51.      * @param string $name The name of the service.
  52.      *
  53.      * @return ObjectManager The instance of the given service.
  54.      */
  55.     abstract protected function getService($name);
  56.     /**
  57.      * Resets the given services.
  58.      *
  59.      * A service in this context is connection or a manager instance.
  60.      *
  61.      * @param string $name The name of the service.
  62.      *
  63.      * @return void
  64.      */
  65.     abstract protected function resetService($name);
  66.     /**
  67.      * Gets the name of the registry.
  68.      *
  69.      * @return string
  70.      */
  71.     public function getName()
  72.     {
  73.         return $this->name;
  74.     }
  75.     /**
  76.      * {@inheritdoc}
  77.      */
  78.     public function getConnection($name null)
  79.     {
  80.         if ($name === null) {
  81.             $name $this->defaultConnection;
  82.         }
  83.         if (! isset($this->connections[$name])) {
  84.             throw new InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.'$this->name$name));
  85.         }
  86.         return $this->getService($this->connections[$name]);
  87.     }
  88.     /**
  89.      * {@inheritdoc}
  90.      */
  91.     public function getConnectionNames()
  92.     {
  93.         return $this->connections;
  94.     }
  95.     /**
  96.      * {@inheritdoc}
  97.      */
  98.     public function getConnections()
  99.     {
  100.         $connections = [];
  101.         foreach ($this->connections as $name => $id) {
  102.             $connections[$name] = $this->getService($id);
  103.         }
  104.         return $connections;
  105.     }
  106.     /**
  107.      * {@inheritdoc}
  108.      */
  109.     public function getDefaultConnectionName()
  110.     {
  111.         return $this->defaultConnection;
  112.     }
  113.     /**
  114.      * {@inheritdoc}
  115.      */
  116.     public function getDefaultManagerName()
  117.     {
  118.         return $this->defaultManager;
  119.     }
  120.     /**
  121.      * {@inheritdoc}
  122.      *
  123.      * @throws InvalidArgumentException
  124.      */
  125.     public function getManager($name null)
  126.     {
  127.         if ($name === null) {
  128.             $name $this->defaultManager;
  129.         }
  130.         if (! isset($this->managers[$name])) {
  131.             throw new InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.'$this->name$name));
  132.         }
  133.         return $this->getService($this->managers[$name]);
  134.     }
  135.     /**
  136.      * {@inheritdoc}
  137.      */
  138.     public function getManagerForClass($class)
  139.     {
  140.         $className $this->getRealClassName($class);
  141.         $proxyClass = new ReflectionClass($className);
  142.         if ($proxyClass->implementsInterface($this->proxyInterfaceName)) {
  143.             $parentClass $proxyClass->getParentClass();
  144.             if (! $parentClass) {
  145.                 return null;
  146.             }
  147.             $className $parentClass->getName();
  148.         }
  149.         foreach ($this->managers as $id) {
  150.             $manager $this->getService($id);
  151.             if (! $manager->getMetadataFactory()->isTransient($className)) {
  152.                 return $manager;
  153.             }
  154.         }
  155.         return null;
  156.     }
  157.     /**
  158.      * {@inheritdoc}
  159.      */
  160.     public function getManagerNames()
  161.     {
  162.         return $this->managers;
  163.     }
  164.     /**
  165.      * {@inheritdoc}
  166.      */
  167.     public function getManagers()
  168.     {
  169.         $dms = [];
  170.         foreach ($this->managers as $name => $id) {
  171.             $dms[$name] = $this->getService($id);
  172.         }
  173.         return $dms;
  174.     }
  175.     /**
  176.      * {@inheritdoc}
  177.      */
  178.     public function getRepository($persistentObject$persistentManagerName null)
  179.     {
  180.         return $this
  181.             ->selectManager($persistentObject$persistentManagerName)
  182.             ->getRepository($persistentObject);
  183.     }
  184.     /**
  185.      * {@inheritdoc}
  186.      */
  187.     public function resetManager($name null)
  188.     {
  189.         if ($name === null) {
  190.             $name $this->defaultManager;
  191.         }
  192.         if (! isset($this->managers[$name])) {
  193.             throw new InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.'$this->name$name));
  194.         }
  195.         // force the creation of a new document manager
  196.         // if the current one is closed
  197.         $this->resetService($this->managers[$name]);
  198.         return $this->getManager($name);
  199.     }
  200.     /**
  201.      * @psalm-param class-string $persistentObjectName
  202.      */
  203.     private function selectManager(string $persistentObjectName, ?string $persistentManagerName null): ObjectManager
  204.     {
  205.         if ($persistentManagerName !== null) {
  206.             return $this->getManager($persistentManagerName);
  207.         }
  208.         return $this->getManagerForClass($persistentObjectName) ?? $this->getManager();
  209.     }
  210.     /**
  211.      * @psalm-return class-string
  212.      */
  213.     private function getRealClassName(string $classNameOrAlias): string
  214.     {
  215.         // Check for namespace alias
  216.         if (strpos($classNameOrAlias':') !== false) {
  217.             [$namespaceAlias$simpleClassName] = explode(':'$classNameOrAlias2);
  218.             /** @psalm-var class-string */
  219.             return $this->getAliasNamespace($namespaceAlias) . '\\' $simpleClassName;
  220.         }
  221.         /** @psalm-var class-string */
  222.         return $classNameOrAlias;
  223.     }
  224. }