Skip to content

Commit 54e5ab5

Browse files
committed
Multiple Entity Managers and Connections
1 parent 34417df commit 54e5ab5

File tree

5 files changed

+111
-23
lines changed

5 files changed

+111
-23
lines changed

src/Console/DqlCommand.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php namespace Mitch\LaravelDoctrine\Console;
22

33
use Doctrine\Common\Util\Debug;
4-
use Doctrine\ORM\EntityManagerInterface;
4+
use Doctrine\Common\Persistence\ManagerRegistry;
55
use Symfony\Component\Console\Input\InputArgument;
66
use Symfony\Component\Console\Input\InputOption;
77

@@ -28,11 +28,11 @@ class DqlCommand extends Command
2828
*/
2929
private $entityManager;
3030

31-
public function __construct(EntityManagerInterface $entityManager)
31+
public function __construct(ManagerRegistry $registry)
3232
{
3333
parent::__construct();
3434

35-
$this->entityManager = $entityManager;
35+
$this->entityManager = $registry->getManager();
3636
}
3737

3838
public function fire()
@@ -53,4 +53,4 @@ protected function getOptions()
5353
['hydrate', null, InputOption::VALUE_OPTIONAL, 'Hydrate type. Available: object, array, scalar, single_scalar, simpleobject']
5454
];
5555
}
56-
}
56+
}

src/Console/GenerateProxiesCommand.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php namespace Mitch\LaravelDoctrine\Console;
22

33
use Illuminate\Console\Command;
4-
use Doctrine\ORM\EntityManagerInterface;
4+
use Doctrine\Common\Persistence\ManagerRegistry;
55

66
class GenerateProxiesCommand extends Command
77
{
@@ -26,11 +26,11 @@ class GenerateProxiesCommand extends Command
2626
*/
2727
private $entityManager;
2828

29-
public function __construct(EntityManagerInterface $entityManager)
29+
public function __construct(ManagerRegistry $registry)
3030
{
3131
parent::__construct();
3232

33-
$this->entityManager = $entityManager;
33+
$this->entityManager = $registry->getManager();
3434
}
3535

3636
public function fire()
@@ -53,4 +53,4 @@ public function fire()
5353
$this->entityManager->getProxyFactory()->generateProxyClasses($metadata, $directory);
5454
$this->info('Proxies have been created.');
5555
}
56-
}
56+
}

src/DoctrineUserProvider.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php namespace Mitch\LaravelDoctrine;
22

3-
use Doctrine\ORM\EntityManager;
3+
use Doctrine\Common\Persistence\ManagerRegistry;
44
use Doctrine\ORM\EntityRepository;
55
use Illuminate\Auth\UserInterface;
66
use Illuminate\Auth\UserProviderInterface;
@@ -13,7 +13,7 @@ class DoctrineUserProvider implements UserProviderInterface
1313
*/
1414
private $hasher;
1515
/**
16-
* @var EntityManager
16+
* @var \Doctrine\ORM\EntityManager
1717
*/
1818
private $entityManager;
1919
/**
@@ -23,13 +23,13 @@ class DoctrineUserProvider implements UserProviderInterface
2323

2424
/**
2525
* @param HasherInterface $hasher
26-
* @param EntityManager $entityManager
26+
* @param ManagerRegistry $registry
2727
* @param $entity
2828
*/
29-
public function __construct(HasherInterface $hasher, EntityManager $entityManager, $entity)
29+
public function __construct(HasherInterface $hasher, ManagerRegistry $registry, $entity)
3030
{
3131
$this->hasher = $hasher;
32-
$this->entityManager = $entityManager;
32+
$this->entityManager = $registry->getManager();
3333
$this->entity = $entity;
3434
}
3535
/**

src/IlluminateRegistry.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php namespace Mitch\LaravelDoctrine;
2+
3+
use Doctrine\ORM\ORMException;
4+
use Illuminate\Container\Container;
5+
use Doctrine\Common\Persistence\AbstractManagerRegistry;
6+
7+
final class IlluminateRegistry extends AbstractManagerRegistry
8+
{
9+
/**
10+
* @var Container
11+
*/
12+
private $container;
13+
14+
public function __construct(Container $container, array $connections, array $entityManagers, $defaultConnection, $defaultEntityManager)
15+
{
16+
$this->container = $container;
17+
parent::__construct('ORM', $connections, $entityManagers, $defaultConnection, $defaultEntityManager, 'Doctrine\ORM\Proxy\Proxy');
18+
}
19+
20+
/**
21+
* Fetches/creates the given services.
22+
* A service in this context is connection or a manager instance.
23+
* @param string $name The name of the service.
24+
* @return object The instance of the given service.
25+
*/
26+
protected function getService($name)
27+
{
28+
return $this->container->make($name);
29+
}
30+
31+
/**
32+
* Resets the given services.
33+
* A service in this context is connection or a manager instance.
34+
* @param string $name The name of the service.
35+
* @return void
36+
*/
37+
protected function resetService($name)
38+
{
39+
return $this->container->bind($name, null);
40+
}
41+
42+
/**
43+
* Resolves a registered namespace alias to the full namespace.
44+
* This method looks for the alias in all registered object managers.
45+
* @param string $alias The alias.
46+
* @throws ORMException
47+
* @return string The full namespace.
48+
*/
49+
public function getAliasNamespace($alias)
50+
{
51+
foreach (array_keys($this->getManagers()) as $name) {
52+
try {
53+
return $this->getManager($name)->getConfiguration()->getEntityNamespace($alias);
54+
} catch (ORMException $e) {
55+
}
56+
}
57+
58+
throw ORMException::unknownEntityNamespace($alias);
59+
}
60+
}

src/LaravelDoctrineServiceProvider.php

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?php namespace Mitch\LaravelDoctrine;
22

33
use App;
4+
use Illuminate\Container\Container;
5+
use Doctrine\Common\Persistence\ManagerRegistry;
6+
use Doctrine\DBAL\DriverManager;
47
use Doctrine\ORM\EntityManagerInterface;
58
use Doctrine\ORM\Events;
69
use Doctrine\ORM\EntityManager;
@@ -38,6 +41,7 @@ public function register()
3841
{
3942
$this->registerConfigurationMapper();
4043
$this->registerCacheManager();
44+
$this->registerManagerRegistry();
4145
$this->registerEntityManager();
4246
$this->registerClassMetadataFactory();
4347

@@ -76,9 +80,9 @@ public function registerCacheManager()
7680
});
7781
}
7882

79-
private function registerEntityManager()
83+
private function registerManagerRegistry()
8084
{
81-
$this->app->singleton(EntityManager::class, function ($app) {
85+
$this->app->singleton(IlluminateRegistry::class, function ($app) {
8286
$config = $app['config']['doctrine::doctrine'];
8387
$metadata = Setup::createAnnotationMetadataConfiguration(
8488
$config['metadata'],
@@ -97,9 +101,33 @@ private function registerEntityManager()
97101

98102
$eventManager = new EventManager;
99103
$eventManager->addEventListener(Events::onFlush, new SoftDeletableListener);
100-
$entityManager = EntityManager::create($this->mapLaravelToDoctrineConfig($app['config']), $metadata, $eventManager);
101-
$entityManager->getFilters()->enable('trashed');
102-
return $entityManager;
104+
105+
$defaultDatabase = $app['config']['database']['default'];
106+
$databaseConnections = $app['config']['database']['connections'];
107+
108+
$registyConnections = array();
109+
$registryManagers = array();
110+
111+
foreach ($databaseConnections as $connectionName => $databaseConfig) {
112+
$connection = DriverManager::getConnection($this->mapLaravelToDoctrineConfig($databaseConfig), $metadata, $eventManager);
113+
$registyConnections[$connectionName] = "doctrine.dbal.{$connectionName}_connection";
114+
$app->instance($registyConnections[$connectionName], $connection);
115+
116+
$entityManager = EntityManager::create($connection, $metadata, $eventManager);
117+
$entityManager->getFilters()->enable('trashed');
118+
$registryManagers[$connectionName] = "doctrine.orm.{$connectionName}_entity_manager";
119+
$app->instance($registryManagers[$connectionName], $entityManager);
120+
}
121+
122+
return new IlluminateRegistry($app, $registyConnections, $registryManagers, $defaultDatabase, $defaultDatabase);
123+
});
124+
$this->app->singleton(ManagerRegistry::class, IlluminateRegistry::class);
125+
}
126+
127+
private function registerEntityManager()
128+
{
129+
$this->app->singleton(EntityManager::class, function ($app) {
130+
return $app->make(IlluminateRegistry::class)->getManager();
103131
});
104132
$this->app->singleton(EntityManagerInterface::class, EntityManager::class);
105133
}
@@ -135,19 +163,19 @@ public function provides()
135163
ClassMetadataFactory::class,
136164
DriverMapper::class,
137165
AuthManager::class,
166+
ManagerRegistry::class,
167+
IlluminateRegistry::class,
138168
];
139169
}
140170

141171
/**
142172
* Map Laravel's to Doctrine's database configuration requirements.
143-
* @param $config
173+
* @param $databaseConfig
144174
* @throws \Exception
145175
* @return array
146176
*/
147-
private function mapLaravelToDoctrineConfig($config)
177+
private function mapLaravelToDoctrineConfig($databaseConfig)
148178
{
149-
$default = $config['database.default'];
150-
$connection = $config["database.connections.{$default}"];
151-
return App::make(DriverMapper::class)->map($connection);
179+
return App::make(DriverMapper::class)->map($databaseConfig);
152180
}
153181
}

0 commit comments

Comments
 (0)