From 565e5634ef58a72fcd3d4bd9db24adea311c23b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20Benja=C4=8D?= Date: Mon, 16 Apr 2018 13:15:41 +0200 Subject: [PATCH] ManagerRegistry --- ruleset.xml | 3 ++ src/DI/OrmExtension.php | 9 +++++ src/ManagerRegistry.php | 76 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 src/ManagerRegistry.php diff --git a/ruleset.xml b/ruleset.xml index 243f9a2..df9000c 100644 --- a/ruleset.xml +++ b/ruleset.xml @@ -19,6 +19,9 @@ + + + /tests/tmp diff --git a/src/DI/OrmExtension.php b/src/DI/OrmExtension.php index c79bcce..2a9f76d 100644 --- a/src/DI/OrmExtension.php +++ b/src/DI/OrmExtension.php @@ -13,6 +13,7 @@ use Nette\InvalidStateException; use Nettrine\ORM\EntityManager; use Nettrine\ORM\EntityManagerFactory; +use Nettrine\ORM\ManagerRegistry; use Nettrine\ORM\Mapping\ContainerEntityListenerResolver; final class OrmExtension extends CompilerExtension @@ -140,6 +141,14 @@ public function loadEntityManagerConfiguration(): void $builder->getDefinitionByType(EventManager::class), // Nettrine/DBAL $entityManagerClass, ]); + + // ManagerRegistry + $builder->addDefinition($this->prefix('managerRegistry')) + ->setClass(ManagerRegistry::class) + ->setArguments([ + $builder->getDefinitionByType(Connection::class), + $this->prefix('@entityManager'), + ]); } } diff --git a/src/ManagerRegistry.php b/src/ManagerRegistry.php new file mode 100644 index 0000000..a1ba6e4 --- /dev/null +++ b/src/ManagerRegistry.php @@ -0,0 +1,76 @@ +findByType(get_class($connection))[0]; + $defaultManager = $container->findByType(get_class($em))[0]; + + $connections = ['default' => $defaultConnection]; + $managers = ['default' => $defaultManager]; + + parent::__construct('ORM', $connections, $managers, 'default', 'default', Proxy::class); + $this->container = $container; + } + + /** + * @param string $name + * @return object + * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint + */ + protected function getService($name): object + { + return $this->container->getService($name); + } + + /** + * @param string $name + * @return void + * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint + */ + protected function resetService($name): void + { + $this->container->removeService($name); + } + + /** + * @param string $alias + * @return string + * @throws ORMException + * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint + */ + public function getAliasNamespace($alias): string + { + foreach (array_keys($this->getManagers()) as $name) { + try { + /** @var EntityManager $entityManager */ + $entityManager = $this->getManager($name); + return $entityManager->getConfiguration()->getEntityNamespace($alias); + } catch (ORMException $e) { + // Ignore + } + } + + throw ORMException::unknownEntityNamespace($alias); + } + +}