Skip to content

Commit

Permalink
ManagerRegistry
Browse files Browse the repository at this point in the history
  • Loading branch information
josefbenjac committed Apr 16, 2018
1 parent e9b95af commit 565e563
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
3 changes: 3 additions & 0 deletions ruleset.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
<rule ref="SlevomatCodingStandard.ControlStructures.AssignmentInCondition.AssignmentInCondition">
<exclude name="SlevomatCodingStandard.ControlStructures.AssignmentInCondition.AssignmentInCondition"/>
</rule>
<rule ref="Generic.CodeAnalysis.EmptyStatement.DetectedCatch">
<exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedCatch"/>
</rule>
<!--Exclude folders -->
<exclude-pattern>/tests/tmp</exclude-pattern>
</ruleset>
9 changes: 9 additions & 0 deletions src/DI/OrmExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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'),
]);
}

}
76 changes: 76 additions & 0 deletions src/ManagerRegistry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php declare(strict_types = 1);

namespace Nettrine\ORM;

use Doctrine\Common\Persistence\AbstractManagerRegistry;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMException;
use Doctrine\ORM\Proxy\Proxy;
use Nette\DI\Container;

class ManagerRegistry extends AbstractManagerRegistry
{

/** @var Container */
private $container;

/**
* @param Connection $connection
* @param EntityManager $em
* @param Container $container
*/
public function __construct(Connection $connection, EntityManager $em, Container $container)
{
$defaultConnection = $container->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);
}

}

0 comments on commit 565e563

Please sign in to comment.