Skip to content

Commit bdf6315

Browse files
committed
MigrationsExtension: support multiple registrations [closes #94]
1 parent 942bc33 commit bdf6315

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

src/Bridges/NetteDI/MigrationsExtension.php

+15-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616

1717
class MigrationsExtension extends Nette\DI\CompilerExtension
1818
{
19+
/** attributes = ['for' => names of target migration extensions] */
1920
const TAG_GROUP = 'nextras.migrations.group';
21+
22+
/** attributes = ['for' => names of target migration extensions, 'extension' => name of handled file extension] */
2023
const TAG_EXTENSION_HANDLER = 'nextras.migrations.extensionHandler';
2124

2225
/** @var array */
@@ -122,13 +125,18 @@ public function beforeCompile()
122125

123126
// configuration
124127
$groups = [];
125-
foreach ($builder->findByTag(self::TAG_GROUP) as $serviceName => $_) {
126-
$groups[] = $builder->getDefinition($serviceName);
128+
foreach ($builder->findByTag(self::TAG_GROUP) as $serviceName => $tagAttributes) {
129+
if (!isset($tagAttributes['for']) || in_array($this->name, $tagAttributes['for'], true)) {
130+
$groups[] = $builder->getDefinition($serviceName);
131+
}
127132
}
128133

129134
$extensionHandlers = [];
130-
foreach ($builder->findByTag(self::TAG_EXTENSION_HANDLER) as $serviceName => $extensionName) {
131-
$extensionHandlers[$extensionName] = $builder->getDefinition($serviceName);
135+
foreach ($builder->findByTag(self::TAG_EXTENSION_HANDLER) as $serviceName => $tagAttributes) {
136+
if (!isset($tagAttributes['for']) || in_array($this->name, $tagAttributes['for'], true)) {
137+
$extensionName = is_string($tagAttributes) ? $tagAttributes : $tagAttributes['extension'];
138+
$extensionHandlers[$extensionName] = $builder->getDefinition($serviceName);
139+
}
132140
}
133141

134142
$builder->getDefinition($this->prefix('configuration'))
@@ -246,7 +254,7 @@ private function createGroupDefinitions(array $groups)
246254

247255
$serviceName = lcfirst(str_replace('-', '', ucwords($groupName, '-')));
248256
$groupDefinitions[] = $builder->addDefinition($this->prefix("group.$serviceName"))
249-
->addTag(self::TAG_GROUP)
257+
->addTag(self::TAG_GROUP, ['for' => [$this->name]])
250258
->setAutowired(FALSE)
251259
->setClass('Nextras\Migrations\Entities\Group')
252260
->addSetup('$name', [$groupName])
@@ -265,13 +273,13 @@ private function createExtensionHandlerDefinitions($driver, $phpParams)
265273
$builder = $this->getContainerBuilder();
266274

267275
$sqlHandler = $builder->addDefinition($this->prefix('extensionHandler.sql'))
268-
->addTag(self::TAG_EXTENSION_HANDLER, 'sql')
276+
->addTag(self::TAG_EXTENSION_HANDLER, ['for' => [$this->name], 'extension' => 'sql'])
269277
->setAutowired(FALSE)
270278
->setClass('Nextras\Migrations\Extensions\SqlHandler')
271279
->setArguments([$driver]);
272280

273281
$phpHandler = $builder->addDefinition($this->prefix('extensionHandler.php'))
274-
->addTag(self::TAG_EXTENSION_HANDLER, 'php')
282+
->addTag(self::TAG_EXTENSION_HANDLER, ['for' => [$this->name], 'extension' => 'php'])
275283
->setClass('Nextras\Migrations\Extensions\PhpHandler')
276284
->setAutowired(FALSE)
277285
->setArguments([$phpParams]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
extensions:
2+
migrationsA: Nextras\Migrations\Bridges\NetteDI\MigrationsExtension
3+
migrationsB: Nextras\Migrations\Bridges\NetteDI\MigrationsExtension
4+
5+
migrationsA:
6+
dir: %rootDir%/migrationsA
7+
driver: mysql
8+
dbal: Nextras\Migrations\Bridges\Dibi\DibiAdapter(Dibi\Connection(%dibiConfig%))
9+
10+
migrationsB:
11+
dir: %rootDir%/migrationsB
12+
driver: mysql
13+
dbal: Nextras\Migrations\Bridges\Dibi\DibiAdapter(Dibi\Connection(%dibiConfig%))

tests/cases/integration/nette-di/MigrationsExtension.phpt

+16
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class MigrationsExtensionTest extends TestCase
7474
if (!method_exists('Nette\DI\Compiler', 'setDynamicParameterNames')) {
7575
Environment::skip('Required Nette >= 2.4.7');
7676
}
77+
7778
Assert::noError(function() {
7879
$this->createContainer('dynamicParameters', [
7980
'rootDir' => __DIR__,
@@ -82,6 +83,21 @@ class MigrationsExtensionTest extends TestCase
8283
}
8384

8485

86+
public function testMultipleRegistrations()
87+
{
88+
$container = $this->createContainer('multipleRegistrations', [
89+
'rootDir' => __DIR__,
90+
]);
91+
92+
$configA = $container->getService('migrationsA.configuration');
93+
$configB = $container->getService('migrationsB.configuration');
94+
95+
Assert::notSame($configA, $configB);
96+
Assert::count(3, $configA->getGroups());
97+
Assert::count(3, $configB->getGroups());
98+
}
99+
100+
85101
/**
86102
* @param string $config
87103
* @return Nette\DI\Container

0 commit comments

Comments
 (0)