Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f1f602a

Browse files
committed
loading recursive imports in regular order
1 parent f9eadf2 commit f1f602a

File tree

7 files changed

+61
-6
lines changed

7 files changed

+61
-6
lines changed

src/Symfony/Component/DependencyInjection/Loader/FileLoader.php

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ abstract class FileLoader extends BaseFileLoader
4646
protected array $aliases = [];
4747
protected bool $autoRegisterAliasesForSinglyImplementedInterfaces = true;
4848
protected bool $prepend = false;
49+
protected array $extensionConfigs = [];
50+
protected int $importing = 0;
4951

5052
/**
5153
* @param bool $prepend Whether to prepend extension config instead of appending them
@@ -71,6 +73,7 @@ public function import(mixed $resource, string $type = null, bool|string $ignore
7173
throw new \TypeError(sprintf('Invalid argument $ignoreErrors provided to "%s::import()": boolean or "not_found" expected, "%s" given.', static::class, get_debug_type($ignoreErrors)));
7274
}
7375

76+
++$this->importing;
7477
try {
7578
return parent::import(...$args);
7679
} catch (LoaderLoadException $e) {
@@ -87,6 +90,8 @@ public function import(mixed $resource, string $type = null, bool|string $ignore
8790
if (__FILE__ !== $frame['file']) {
8891
throw $e;
8992
}
93+
} finally {
94+
--$this->importing;
9095
}
9196

9297
return null;
@@ -224,11 +229,37 @@ public function registerAliasesForSinglyImplementedInterfaces(): void
224229

225230
protected function loadExtensionConfig(string $namespace, array $config): void
226231
{
227-
if ($this->prepend) {
228-
$this->container->prependExtensionConfig($namespace, $config);
229-
} else {
232+
if (!$this->prepend) {
230233
$this->container->loadFromExtension($namespace, $config);
234+
235+
return;
236+
}
237+
238+
if ($this->importing) {
239+
if (!isset($this->extensionConfigs[$namespace])) {
240+
$this->extensionConfigs[$namespace] = [];
241+
}
242+
array_unshift($this->extensionConfigs[$namespace], $config);
243+
244+
return;
245+
}
246+
247+
$this->container->prependExtensionConfig($namespace, $config);
248+
}
249+
250+
protected function loadExtensionConfigs(): void
251+
{
252+
if ($this->importing || [] === $this->extensionConfigs) {
253+
return;
231254
}
255+
256+
foreach ($this->extensionConfigs as $namespace => $configs) {
257+
foreach ($configs as $config) {
258+
$this->container->prependExtensionConfig($namespace, $config);
259+
}
260+
}
261+
262+
$this->extensionConfigs = [];
232263
}
233264

234265
/**

src/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,19 @@ class_exists(ContainerConfigurator::class);
145145

146146
$callback(...$arguments);
147147

148-
/** @var ConfigBuilderInterface $configBuilder */
148+
$this->loadFromExtensions($configBuilders);
149+
}
150+
151+
/**
152+
* @param iterable<ConfigBuilderInterface> $configBuilders
153+
*/
154+
private function loadFromExtensions(iterable $configBuilders): void
155+
{
149156
foreach ($configBuilders as $configBuilder) {
150157
$this->loadExtensionConfig($configBuilder->getExtensionAlias(), $configBuilder->toArray());
151158
}
159+
160+
$this->loadExtensionConfigs();
152161
}
153162

154163
/**

src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,8 @@ private function loadFromExtensions(\DOMDocument $xml): void
832832

833833
$this->loadExtensionConfig($node->namespaceURI, $values);
834834
}
835+
836+
$this->loadExtensionConfigs();
835837
}
836838

837839
/**

src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,8 @@ private function loadFromExtensions(array $content): void
947947

948948
$this->loadExtensionConfig($namespace, $values);
949949
}
950+
951+
$this->loadExtensionConfigs();
950952
}
951953

952954
private function checkDefinition(string $id, array $definition, string $file): void

src/Symfony/Component/DependencyInjection/Tests/Extension/AbstractExtensionTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,11 @@ public function getAlias(): string
8888
$container = $this->processPrependExtension($extension);
8989

9090
$expected = [
91-
['foo' => 'ping'],
92-
['foo' => 'b'],
9391
['foo' => 'a'],
92+
['foo' => 'c1'],
93+
['foo' => 'c2'],
94+
['foo' => 'b'],
95+
['foo' => 'ping'],
9496
['foo' => 'pong'],
9597
['foo' => 'bar'],
9698
];
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
imports:
2+
- { resource: './third_c.yaml' }
3+
14
third:
25
foo: b
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
third:
2+
foo: c1
3+
4+
when@test:
5+
third:
6+
foo: c2

0 commit comments

Comments
 (0)