Chris@0: . Chris@0: */ Chris@0: Chris@0: namespace Doctrine\Common\Persistence; Chris@0: Chris@0: /** Chris@0: * Abstract implementation of the ManagerRegistry contract. Chris@0: * Chris@0: * @link www.doctrine-project.org Chris@0: * @since 2.2 Chris@0: * @author Fabien Potencier Chris@0: * @author Benjamin Eberlei Chris@0: * @author Lukas Kahwe Smith Chris@0: */ Chris@0: abstract class AbstractManagerRegistry implements ManagerRegistry Chris@0: { Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: private $name; Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@0: private $connections; Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@0: private $managers; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: private $defaultConnection; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: private $defaultManager; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: private $proxyInterfaceName; Chris@0: Chris@0: /** Chris@0: * Constructor. Chris@0: * Chris@0: * @param string $name Chris@0: * @param array $connections Chris@0: * @param array $managers Chris@0: * @param string $defaultConnection Chris@0: * @param string $defaultManager Chris@0: * @param string $proxyInterfaceName Chris@0: */ Chris@0: public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) Chris@0: { Chris@0: $this->name = $name; Chris@0: $this->connections = $connections; Chris@0: $this->managers = $managers; Chris@0: $this->defaultConnection = $defaultConnection; Chris@0: $this->defaultManager = $defaultManager; Chris@0: $this->proxyInterfaceName = $proxyInterfaceName; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Fetches/creates the given services. Chris@0: * Chris@0: * A service in this context is connection or a manager instance. Chris@0: * Chris@0: * @param string $name The name of the service. Chris@0: * Chris@0: * @return object The instance of the given service. Chris@0: */ Chris@0: abstract protected function getService($name); Chris@0: Chris@0: /** Chris@0: * Resets the given services. Chris@0: * Chris@0: * A service in this context is connection or a manager instance. Chris@0: * Chris@0: * @param string $name The name of the service. Chris@0: * Chris@0: * @return void Chris@0: */ Chris@0: abstract protected function resetService($name); Chris@0: Chris@0: /** Chris@0: * Gets the name of the registry. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function getName() Chris@0: { Chris@0: return $this->name; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConnection($name = null) Chris@0: { Chris@0: if (null === $name) { Chris@0: $name = $this->defaultConnection; Chris@0: } Chris@0: Chris@0: if (!isset($this->connections[$name])) { Chris@0: throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); Chris@0: } Chris@0: Chris@0: return $this->getService($this->connections[$name]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConnectionNames() Chris@0: { Chris@0: return $this->connections; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConnections() Chris@0: { Chris@0: $connections = []; Chris@0: foreach ($this->connections as $name => $id) { Chris@0: $connections[$name] = $this->getService($id); Chris@0: } Chris@0: Chris@0: return $connections; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getDefaultConnectionName() Chris@0: { Chris@0: return $this->defaultConnection; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getDefaultManagerName() Chris@0: { Chris@0: return $this->defaultManager; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: * Chris@0: * @throws \InvalidArgumentException Chris@0: */ Chris@0: public function getManager($name = null) Chris@0: { Chris@0: if (null === $name) { Chris@0: $name = $this->defaultManager; Chris@0: } Chris@0: Chris@0: if (!isset($this->managers[$name])) { Chris@0: throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); Chris@0: } Chris@0: Chris@0: return $this->getService($this->managers[$name]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getManagerForClass($class) Chris@0: { Chris@0: // Check for namespace alias Chris@0: if (strpos($class, ':') !== false) { Chris@0: list($namespaceAlias, $simpleClassName) = explode(':', $class, 2); Chris@0: $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; Chris@0: } Chris@0: Chris@0: $proxyClass = new \ReflectionClass($class); Chris@0: Chris@0: if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { Chris@0: if (! $parentClass = $proxyClass->getParentClass()) { Chris@0: return null; Chris@0: } Chris@0: Chris@0: $class = $parentClass->getName(); Chris@0: } Chris@0: Chris@0: foreach ($this->managers as $id) { Chris@0: $manager = $this->getService($id); Chris@0: Chris@0: if (!$manager->getMetadataFactory()->isTransient($class)) { Chris@0: return $manager; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getManagerNames() Chris@0: { Chris@0: return $this->managers; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getManagers() Chris@0: { Chris@0: $dms = []; Chris@0: foreach ($this->managers as $name => $id) { Chris@0: $dms[$name] = $this->getService($id); Chris@0: } Chris@0: Chris@0: return $dms; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRepository($persistentObjectName, $persistentManagerName = null) Chris@0: { Chris@0: return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function resetManager($name = null) Chris@0: { Chris@0: if (null === $name) { Chris@0: $name = $this->defaultManager; Chris@0: } Chris@0: Chris@0: if (!isset($this->managers[$name])) { Chris@0: throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); Chris@0: } Chris@0: Chris@0: // force the creation of a new document manager Chris@0: // if the current one is closed Chris@0: $this->resetService($this->managers[$name]); Chris@0: Chris@0: return $this->getManager($name); Chris@0: } Chris@0: }