Skip to content

Commit dfc3796

Browse files
committed
added ConfiguratorsExtension [problem v nette\database]
1 parent f3462df commit dfc3796

File tree

10 files changed

+89
-6
lines changed

10 files changed

+89
-6
lines changed

src/DI/Compiler.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class Compiler
2323
private const
2424
SERVICES = 'services',
2525
PARAMETERS = 'parameters',
26-
DI = 'di';
26+
DI = 'di',
27+
CONFIGURATORS = 'configurators';
2728

2829
/** @var CompilerExtension[] */
2930
private $extensions = [];
@@ -53,6 +54,7 @@ public function __construct(?ContainerBuilder $builder = null)
5354
$this->dependencies = new DependencyChecker;
5455
$this->addExtension(self::SERVICES, new Extensions\ServicesExtension);
5556
$this->addExtension(self::PARAMETERS, new Extensions\ParametersExtension($this->configs));
57+
$this->addExtension(self::CONFIGURATORS, new Extensions\ConfiguratorsExtension);
5658
}
5759

5860

@@ -217,7 +219,10 @@ public function compile(): string
217219
/** @internal */
218220
public function processExtensions(): void
219221
{
220-
$first = $this->getExtensions(Extensions\ParametersExtension::class) + $this->getExtensions(Extensions\ExtensionsExtension::class);
222+
$first = $this->getExtensions(Extensions\ConfiguratorsExtension::class)
223+
+ $this->getExtensions(Extensions\ParametersExtension::class)
224+
+ $this->getExtensions(Extensions\ExtensionsExtension::class);
225+
221226
foreach ($first as $name => $extension) {
222227
$config = $this->processSchema($extension->getConfigSchema(), $this->configs[$name] ?? [], $name);
223228
$extension->setConfig($this->config[$name] = $config);
@@ -233,7 +238,11 @@ public function processExtensions(): void
233238

234239
$extensions = array_diff_key($this->extensions, $first, [self::SERVICES => 1]);
235240
foreach ($extensions as $name => $extension) {
236-
$config = $this->processSchema($extension->getConfigSchema(), $this->configs[$name] ?? [], $name);
241+
$config = $this->processSchema(
242+
$extension->getConfigSchema(),
243+
array_merge([(array) $extension->getConfig()], $this->configs[$name] ?? []),
244+
$name
245+
);
237246
$extension->setConfig($this->config[$name] = $config);
238247
}
239248

src/DI/Config/Adapters/PhpAdapter.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ final class PhpAdapter implements Nette\DI\Config\Adapter
2424
*/
2525
public function load(string $file): array
2626
{
27-
return require $file;
27+
$data = require $file;
28+
return $data instanceof \Closure
29+
? ['configurators' => [$data]]
30+
: $data;
2831
}
2932

3033

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the Nette Framework (https://nette.org)
5+
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace Nette\DI\Extensions;
11+
12+
use Nette;
13+
14+
15+
/**
16+
* PHP configurators.
17+
*/
18+
class ConfiguratorsExtension extends Nette\DI\CompilerExtension
19+
{
20+
public function loadConfiguration()
21+
{
22+
foreach ($this->config as $callback) {
23+
$callback($this->compiler);
24+
}
25+
}
26+
}

tests/DI/Compiler.config.phpt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ test('Compiler config', function () {
2929

3030
Assert::same(
3131
[
32+
'configurators' => [],
3233
'parameters' => [
3334
'item1' => 1,
3435
],

tests/DI/Compiler.extension.anonymous.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ $compiler = new DI\Compiler;
1818
$compiler->addExtension(null, new FooExtension);
1919
$compiler->addExtension(null, new FooExtension);
2020

21-
Assert::count(4, $compiler->getExtensions());
21+
Assert::count(5, $compiler->getExtensions());

tests/DI/Compiler.loadConfig.include.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ Assert::same([
2424
__DIR__ . DIRECTORY_SEPARATOR . 'files/loader.includes.grandchild.neon',
2525
(new ReflectionClass(Nette\DI\Extensions\ServicesExtension::class))->getFileName(),
2626
(new ReflectionClass(Nette\DI\Extensions\ParametersExtension::class))->getFileName(),
27+
(new ReflectionClass(Nette\DI\Extensions\ConfiguratorsExtension::class))->getFileName(),
2728
], array_keys($compiler->exportDependencies()[1]));
2829

2930

3031
Assert::equal([
32+
'configurators' => [],
3133
'parameters' => [
3234
'me' => [
3335
'loader.includes.child.neon',
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\DI;
6+
use Tester\Assert;
7+
8+
require __DIR__ . '/../bootstrap.php';
9+
10+
11+
class Service
12+
{
13+
}
14+
15+
16+
$compiler = new DI\Compiler;
17+
$compiler->loadConfig(__DIR__ . '/files/phpConfig1.php');
18+
$compiler->loadConfig(__DIR__ . '/files/phpConfig2.php');
19+
$container = createContainer($compiler);
20+
21+
Assert::type(Service::class, $container->getByType(Service::class));
22+
Assert::same(['foo' => 123], $container->parameters);

tests/DI/ExtensionsExtension.basic.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,4 @@ foo:
7070

7171
Assert::same('hello', $container->parameters['foo']);
7272
Assert::same('test', $container->parameters['bar']);
73-
Assert::same(['services', 'parameters', 'first', 'extensions', 'foo', 'bar'], $container->parameters['first']);
73+
Assert::same(['services', 'parameters', 'configurators', 'first', 'extensions', 'foo', 'bar'], $container->parameters['first']);

tests/DI/files/phpConfig1.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
return function (Nette\DI\Compiler $compiler) {
6+
$builder = $compiler->getContainerBuilder();
7+
$builder->addDefinition(null)
8+
->setFactory(Service::class);
9+
};

tests/DI/files/phpConfig2.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
return function (Nette\DI\Compiler $compiler) {
6+
$compiler->addConfig([
7+
'parameters' => [
8+
'foo' => 123,
9+
],
10+
]);
11+
};

0 commit comments

Comments
 (0)