Skip to content

Commit 333d42f

Browse files
committed
Compiler, CompilerExtension: shows suggestions for unexpected config items and extensions
1 parent 274cab5 commit 333d42f

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

src/DI/Compiler.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,12 @@ public function processExtensions()
179179
$extra = implode("', '", array_keys($extra));
180180
throw new Nette\DeprecatedException("Extensions '$extra' were added while container was being compiled.");
181181

182-
} elseif ($extra = array_diff_key($this->config, self::$reserved, $this->extensions)) {
183-
$extra = implode("', '", array_keys($extra));
184-
throw new Nette\InvalidStateException("Found sections '$extra' in configuration, but corresponding extensions are missing.");
182+
} elseif ($extra = key(array_diff_key($this->config, self::$reserved, $this->extensions))) {
183+
$hint = Nette\Utils\ObjectMixin::getSuggestion(array_keys(self::$reserved + $this->extensions), $extra);
184+
throw new Nette\InvalidStateException(
185+
"Found section '$extra' in configuration, but corresponding extension is missing"
186+
. ($hint ? ", did you mean '$hint'?" : '.')
187+
);
185188
}
186189
}
187190

src/DI/CompilerExtension.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ public function validateConfig(array $expected, array $config = NULL, $name = NU
6565
}
6666
if ($extra = array_diff_key((array) $config, $expected)) {
6767
$name = $name ?: $this->name;
68-
$extra = implode(", $name.", array_keys($extra));
69-
throw new Nette\InvalidStateException("Unknown configuration option $name.$extra.");
68+
$hint = Nette\Utils\ObjectMixin::getSuggestion(array_keys($expected), key($extra));
69+
$extra = $hint ? key($extra) : implode(", $name.", array_keys($extra));
70+
throw new Nette\InvalidStateException("Unknown configuration option $name.$extra" . ($hint ? ", did you mean $name.$hint?" : '.'));
7071
}
7172
return Config\Helpers::merge($config, $expected);
7273
}

tests/DI/CompilerExtension.validateConfig.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ test(function () {
4747
Assert::exception(function () {
4848
$ext = new MyExtension;
4949
$ext->validateConfig(['a' => 1, 'b' => 1], ['c' => 1]);
50-
}, Nette\InvalidStateException::class, 'Unknown configuration option my.c.');
50+
}, Nette\InvalidStateException::class, 'Unknown configuration option my.c, did you mean my.a?');
5151

5252
Assert::exception(function () {
5353
$ext = new MyExtension;
5454
$ext->validateConfig(['a' => 1, 'b' => 1], ['c' => 1, 'd' => 1], 'name');
55-
}, Nette\InvalidStateException::class, 'Unknown configuration option name.c, name.d.');
55+
}, Nette\InvalidStateException::class, 'Unknown configuration option name.c, did you mean name.a?');
5656

5757
Assert::exception(function () {
5858
$ext = new MyExtension;
5959
$ext->setConfig(['c' => 1, 'd' => 1]);
6060
$ext->validateConfig(['a' => 1, 'b' => 1]);
61-
}, Nette\InvalidStateException::class, 'Unknown configuration option my.c, my.d.');
61+
}, Nette\InvalidStateException::class, 'Unknown configuration option my.c, did you mean my.a?');

0 commit comments

Comments
 (0)