From bf6655a534a6775d30cafa67bd801276bda1d98d Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 13 Aug 2024 23:45:21 +0200 Subject: =?UTF-8?q?VERSION=200.2=20doctrine=20ORM=20et=20entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Persistence/AbstractManagerRegistry.php | 269 +++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 vendor/doctrine/persistence/src/Persistence/AbstractManagerRegistry.php (limited to 'vendor/doctrine/persistence/src/Persistence/AbstractManagerRegistry.php') diff --git a/vendor/doctrine/persistence/src/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/persistence/src/Persistence/AbstractManagerRegistry.php new file mode 100644 index 0000000..cc245ba --- /dev/null +++ b/vendor/doctrine/persistence/src/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,269 @@ + */ + private $connections; + + /** @var array */ + private $managers; + + /** @var string */ + private $defaultConnection; + + /** @var string */ + private $defaultManager; + + /** + * @var string + * @psalm-var class-string + */ + private $proxyInterfaceName; + + /** + * @param array $connections + * @param array $managers + * @psalm-param class-string $proxyInterfaceName + */ + public function __construct( + string $name, + array $connections, + array $managers, + string $defaultConnection, + string $defaultManager, + string $proxyInterfaceName + ) { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services. + * + * A service in this context is connection or a manager instance. + * + * @param string $name The name of the service. + * + * @return object The instance of the given service. + */ + abstract protected function getService(string $name); + + /** + * Resets the given services. + * + * A service in this context is connection or a manager instance. + * + * @param string $name The name of the service. + * + * @return void + */ + abstract protected function resetService(string $name); + + /** + * Gets the name of the registry. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * {@inheritDoc} + */ + public function getConnection(?string $name = null) + { + if ($name === null) { + $name = $this->defaultConnection; + } + + if (! isset($this->connections[$name])) { + throw new InvalidArgumentException( + sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name) + ); + } + + return $this->getService($this->connections[$name]); + } + + /** + * {@inheritDoc} + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * {@inheritDoc} + */ + public function getConnections() + { + $connections = []; + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * {@inheritDoc} + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * {@inheritDoc} + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * {@inheritDoc} + * + * @throws InvalidArgumentException + */ + public function getManager(?string $name = null) + { + if ($name === null) { + $name = $this->defaultManager; + } + + if (! isset($this->managers[$name])) { + throw new InvalidArgumentException( + sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name) + ); + } + + $service = $this->getService($this->managers[$name]); + assert($service instanceof ObjectManager); + + return $service; + } + + /** + * {@inheritDoc} + */ + public function getManagerForClass(string $class) + { + $proxyClass = new ReflectionClass($class); + if ($proxyClass->isAnonymous()) { + return null; + } + + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $parentClass = $proxyClass->getParentClass(); + + if ($parentClass === false) { + return null; + } + + $class = $parentClass->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + assert($manager instanceof ObjectManager); + + if (! $manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * {@inheritDoc} + */ + public function getManagers() + { + $managers = []; + + foreach ($this->managers as $name => $id) { + $manager = $this->getService($id); + assert($manager instanceof ObjectManager); + $managers[$name] = $manager; + } + + return $managers; + } + + /** + * {@inheritDoc} + */ + public function getRepository( + string $persistentObject, + ?string $persistentManagerName = null + ) { + return $this + ->selectManager($persistentObject, $persistentManagerName) + ->getRepository($persistentObject); + } + + /** + * {@inheritDoc} + */ + public function resetManager(?string $name = null) + { + if ($name === null) { + $name = $this->defaultManager; + } + + if (! isset($this->managers[$name])) { + throw new InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + + return $this->getManager($name); + } + + /** @psalm-param class-string $persistentObject */ + private function selectManager( + string $persistentObject, + ?string $persistentManagerName = null + ): ObjectManager { + if ($persistentManagerName !== null) { + return $this->getManager($persistentManagerName); + } + + return $this->getManagerForClass($persistentObject) ?? $this->getManager(); + } +} -- cgit v1.2.3