Skip to content

Commit 4bd56af

Browse files
authored
Merge pull request #2 from ray-di/qualifier
Named injection for multiple database connection
2 parents f9f2f77 + 9cff810 commit 4bd56af

File tree

4 files changed

+76
-13
lines changed

4 files changed

+76
-13
lines changed

README.md

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,38 @@ class AppModule extends AbstractModule
2323
$this->install(new DbalModule('driver=pdo_sqlite&memory=true');
2424
}
2525
}
26+
```
27+
28+
### for named binding
29+
30+
Set `qualifer` in 2nd parameter in DbalModule.
31+
32+
```php
33+
$this->install(new DbalModule('driver=pdo_sqlite&memory=true', 'log_db');
34+
```
35+
36+
Use qualifer in `@Inject`.
2637

38+
```php
39+
/**
40+
* @Inject
41+
* @Named("log_db")
42+
*/
43+
public function setLogDb(Connection $logDb)
44+
{
45+
$this->logDb = $logDb;
46+
}
2747
```
28-
### DI trait
48+
## DI trait
2949

30-
* [DbalInject](https://github.com/BEARSunday/BEAR.DbalModule/blob/master/src/DbalInject.php) for `Doctrine\DBAL\Driver\Connection` interface
50+
* [DbalInject](https://github.com/BEARSunday/BEAR.DbalModule/blob/1.x/src/DbalInject.php) for `Doctrine\DBAL\Driver\Connection` interface
3151

32-
### Demo
52+
## Demo
3353

3454
$ php docs/demo/run.php
3555
// It works!
3656

37-
### Requiuments
57+
## Requiuments
3858

3959
* PHP 5.4+
4060
* hhvm

src/DbalModule.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Doctrine\DBAL\Driver\Connection;
1111
use Ray\DbalModule\Annotation\DbalConfig;
1212
use Ray\Di\AbstractModule;
13+
use Ray\Di\Name;
1314
use Ray\Di\Scope;
1415

1516
class DbalModule extends AbstractModule
@@ -20,11 +21,18 @@ class DbalModule extends AbstractModule
2021
private $config;
2122

2223
/**
23-
* @param string $config
24+
* @var string
25+
*/
26+
private $qualifier;
27+
28+
/**
29+
* @param AbstractModule $config
30+
* @param string $qualifier
2431
*/
25-
public function __construct($config)
32+
public function __construct($config, $qualifier = Name::ANY)
2633
{
2734
$this->config = $config;
35+
$this->qualifier = $qualifier;
2836
}
2937

3038
/**
@@ -33,7 +41,7 @@ public function __construct($config)
3341
protected function configure()
3442
{
3543
AnnotationRegistry::registerFile(__DIR__ . '/DoctrineAnnotations.php');
36-
$this->bind()->annotatedWith(DbalConfig::class)->toInstance($this->config);
37-
$this->bind(Connection::class)->toProvider(DbalProvider::class)->in(Scope::SINGLETON);
44+
$this->bind()->annotatedWith($this->qualifier)->annotatedWith(DbalConfig::class)->toInstance($this->config);
45+
$this->bind(Connection::class)->annotatedWith($this->qualifier)->toProvider(DbalProvider::class, $this->qualifier)->in(Scope::SINGLETON);
3846
}
3947
}

src/DbalProvider.php

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,44 @@
88

99
use Doctrine\DBAL\DriverManager;
1010
use Ray\DbalModule\Annotation\DbalConfig;
11+
use Ray\Di\Di\PostConstruct;
12+
use Ray\Di\InjectorInterface;
1113
use Ray\Di\ProviderInterface;
14+
use Ray\Di\SetContextInterface;
1215

13-
class DbalProvider implements ProviderInterface
16+
class DbalProvider implements ProviderInterface, SetContextInterface
1417
{
18+
/**
19+
* @var InjectorInterface
20+
*/
21+
private $injector;
22+
23+
/**
24+
* @var string
25+
*/
26+
private $context;
27+
1528
/**
1629
* @var array
1730
*/
1831
private $config;
1932

33+
public function __construct(InjectorInterface $injector)
34+
{
35+
$this->injector = $injector;
36+
}
37+
38+
public function setContext($context)
39+
{
40+
$this->context = $context;
41+
}
42+
2043
/**
21-
* @param string $config
22-
*
23-
* @DbalConfig
44+
* @PostConstruct
2445
*/
25-
public function __construct($config)
46+
public function init()
2647
{
48+
$config = $this->injector->getInstance('', DbalConfig::class . $this->context);
2749
if (is_array($config)) {
2850
$this->config = $config;
2951

@@ -40,6 +62,7 @@ public function __construct($config)
4062
throw new \InvalidArgumentException('@DbalConfig');
4163
}
4264

65+
4366
/**
4467
* {@inheritdoc}
4568
*/

tests/DbalModuleTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,16 @@ public function testModule()
1212
$instance = (new Injector(new DbalModule('driver=pdo_sqlite&memory=true'), $_ENV['TMP_DIR']))->getInstance(Connection::class);
1313
$this->assertInstanceOf(Connection::class, $instance);
1414
}
15+
16+
public function testQualifier()
17+
{
18+
$db1Module = new DbalModule('driver=pdo_sqlite&memory=true','db1');
19+
$db2Module = new DbalModule('driver=pdo_sqlite&memory=true','db2');
20+
$db1 = (new Injector($db1Module, $_ENV['TMP_DIR']))->getInstance(Connection::class, 'db1');
21+
$db2 = (new Injector($db2Module, $_ENV['TMP_DIR']))->getInstance(Connection::class, 'db2');
22+
$db1a = (new Injector($db1Module, $_ENV['TMP_DIR']))->getInstance(Connection::class, 'db1');
23+
$this->assertInstanceOf(Connection::class, $db1);
24+
$this->assertNotSame($db1, $db2);
25+
$this->assertSame($db1, $db1a);
26+
}
1527
}

0 commit comments

Comments
 (0)