Skip to content

Commit 6f79ad1

Browse files
committed
MigrationsExtension: support multiple registrations [closes #94]
1 parent c8da3af commit 6f79ad1

File tree

3 files changed

+42
-7
lines changed

3 files changed

+42
-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 */
@@ -123,13 +126,18 @@ public function beforeCompile()
123126

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

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

135143
$builder->getDefinition($this->prefix('configuration'))
@@ -247,7 +255,7 @@ private function createGroupDefinitions(array $groups)
247255

248256
$serviceName = lcfirst(str_replace('-', '', ucwords($groupName, '-')));
249257
$groupDefinitions[] = $builder->addDefinition($this->prefix("group.$serviceName"))
250-
->addTag(self::TAG_GROUP)
258+
->addTag(self::TAG_GROUP, ['for' => [$this->name]])
251259
->setAutowired(FALSE)
252260
->setClass('Nextras\Migrations\Entities\Group')
253261
->addSetup('$name', [$groupName])
@@ -266,13 +274,13 @@ private function createExtensionHandlerDefinitions($driver, $phpParams)
266274
$builder = $this->getContainerBuilder();
267275

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

274282
$phpHandler = $builder->addDefinition($this->prefix('extensionHandler.php'))
275-
->addTag(self::TAG_EXTENSION_HANDLER, 'php')
283+
->addTag(self::TAG_EXTENSION_HANDLER, ['for' => [$this->name], 'extension' => 'php'])
276284
->setClass('Nextras\Migrations\Extensions\PhpHandler')
277285
->setAutowired(FALSE)
278286
->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: migrationsA
7+
driver: mysql
8+
dbal: Nextras\Migrations\Bridges\Dibi\DibiAdapter(Dibi\Connection(%dibiConfig%))
9+
10+
migrationsB:
11+
dir: migrationsB
12+
driver: mysql
13+
dbal: Nextras\Migrations\Bridges\Dibi\DibiAdapter(Dibi\Connection(%dibiConfig%))

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

+14
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,19 @@ class MigrationsExtensionTest extends TestCase
8283
}
8384

8485

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

0 commit comments

Comments
 (0)