Skip to content

Commit

Permalink
ParametersExtension: exports both statements and dynamic parameters, …
Browse files Browse the repository at this point in the history
…preloads only the latter
  • Loading branch information
dg committed Feb 3, 2024
1 parent c84fb97 commit 800a7e8
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 8 deletions.
14 changes: 9 additions & 5 deletions src/DI/Extensions/ParametersExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ public function afterCompile(Nette\PhpGenerator\ClassType $class)
->addBody('return ?;', [array_diff_key($builder->parameters, $dynamicParams)]);
$class->addMember($method);

$dynamicParams = array_keys($dynamicParams, true, true);
if (!$dynamicParams) {
return;
}
Expand All @@ -83,16 +82,21 @@ public function afterCompile(Nette\PhpGenerator\ClassType $class)
$method = Method::from([Container::class, 'getDynamicParameter']);
$class->addMember($method);
$method->addBody('switch (true) {');
foreach ($dynamicParams as $key) {
foreach ($dynamicParams as $key => $foo) {
$value = Helpers::expand($this->config[$key] ?? null, $builder->parameters);
$value = $generator->convertArguments($resolver->completeArguments(Helpers::filterArguments([$value])))[0];
$method->addBody("\tcase \$key === ?: return ?;", [$key, $value]);
try {
$value = $generator->convertArguments($resolver->completeArguments(Helpers::filterArguments([$value])))[0];
$method->addBody("\tcase \$key === ?: return ?;", [$key, $value]);
} catch (Nette\DI\ServiceCreationException $e) {
$method->addBody("\tcase \$key === ?: throw new Nette\DI\ServiceCreationException(?);", [$key, $e->getMessage()]);
}
}
$method->addBody("\tdefault: return parent::getDynamicParameter(\$key);\n};");

$method = Method::from([Container::class, 'getParameters']);
$class->addMember($method);
$method->addBody('array_map([$this, \'getParameter\'], ?);', [$dynamicParams]);
// preload DynamicParameter only
$method->addBody('array_map([$this, \'getParameter\'], ?);', [array_keys($dynamicParams, true, true)]);
$method->addBody('return parent::getParameters();');

foreach ($this->dynamicValidators as [$param, $expected, $path]) {
Expand Down
36 changes: 33 additions & 3 deletions tests/DI/Compiler.parameters.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@ test('Statement as parameter', function () {

Assert::same([], $container->parameters);
Assert::same([], $container->getParameters());
Assert::exception(function () use ($container) {
$container->getParameter('bar');
}, Nette\InvalidStateException::class, "Parameter 'bar' not found. Check if 'di › export › parameters' is enabled.");
Assert::same('a', $container->getParameter('bar'));
Assert::same('a', $container->getService('one')->arg);
});

Expand Down Expand Up @@ -157,3 +155,35 @@ test('Not circular reference', function () {
$container->getParameters()
);
});


test('Invalid statement as parameter', function () {
$compiler = new DI\Compiler;
$container = createContainer($compiler, '
parameters:
bar: unknown()
');

Assert::same([], $container->getParameters());
Assert::exception(
function () use ($container) { $container->getParameter('bar'); },
Nette\DI\ServiceCreationException::class,
"Class 'unknown' not found."
);
});


test('Invalid statement as parameter', function () {
$compiler = new DI\Compiler;
$container = createContainer($compiler, '
parameters:
bar: Service::unknown()
');

Assert::same([], $container->getParameters());
Assert::exception(
function () use ($container) { $container->getParameter('bar'); },
Error::class,
'Call to undefined method Service::unknown()'
);
});
7 changes: 7 additions & 0 deletions tests/DI/expected/compiler.parameters.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,19 @@ protected function getDynamicParameter($key)
'inner' => $this->getParameter('dynamic')['foo'],
'expr' => trim(' a '),
];
case $key === 'expr': return trim(' a ');
case $key === 'arrayExpr': return ['expr' => trim(' a ')];
case $key === 'arrayExpr2': return ['expr' => trim(' a ')];
case $key === 'arrayDynamic': return [
'dynamic' => $this->getParameter('dynamic'),
'inner' => $this->getParameter('dynamic')['foo'],
];
case $key === 'arrayMix': return ['expr' => trim(' a '), 'dynamic' => $this->getParameter('dynamic')];
case $key === 'refDynamic': return $this->getParameter('dynamic');
case $key === 'refDynamic2': return $this->getParameter('dynamic')['foo'];
case $key === 'refExpr': return trim(' a ');
case $key === 'refArrayE1': return ['expr' => trim(' a ')];
case $key === 'refArrayE2': return trim(' a ');
case $key === 'refArrayD1': return [
'dynamic' => $this->getParameter('dynamic'),
'inner' => $this->getParameter('dynamic')['foo'],
Expand Down

0 comments on commit 800a7e8

Please sign in to comment.