Skip to content

Commit 679e001

Browse files
committed
more self explanatory message for factory and service mismatch (closes #199) (#284)
1 parent b3fd5f3 commit 679e001

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

src/DI/Definitions/FactoryDefinition.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,22 @@ private function completeParameters(Nette\DI\Resolver $resolver): void
216216
$this->resultDefinition->getCreator()->arguments[$ctorParam->getPosition()] = new Php\Literal('$' . $ctorParam->name);
217217

218218
} elseif (!$this->resultDefinition->getSetup()) {
219-
$hint = Nette\Utils\Helpers::getSuggestion(array_keys($ctorParams), $param->name);
219+
// [param1, param2] => '$param1, $param2'
220+
$stringifyParams = function (array $params): string {
221+
return implode(', ', array_map(
222+
function (string $param) { return '$' . $param; },
223+
$params
224+
));
225+
};
226+
$ctorParamsKeys = array_keys($ctorParams);
227+
$hint = Nette\Utils\Helpers::getSuggestion($ctorParamsKeys, $param->name);
220228
throw new ServiceCreationException(sprintf(
221-
'Unused parameter $%s when implementing method %s::create()',
222-
$param->name,
223-
$interface
224-
) . ($hint ? ", did you mean \${$hint}?" : '.'));
229+
'Cannot implement %s::create(): factory method parameters (%s) are not matching %s::__construct() parameters (%s).',
230+
$interface,
231+
$stringifyParams(array_map(function (\ReflectionParameter $param) { return $param->name; }, $method->getParameters())),
232+
$class,
233+
$stringifyParams($ctorParamsKeys)
234+
) . ($hint ? " Did you mean to use '\${$hint}' in factory method?" : ''));
225235
}
226236

227237
$paramDef = $methodType . ' ' . $param->name;

tests/DI/Compiler.generatedFactory.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ Assert::exception(function () {
302302
$builder->addFactoryDefinition('one')
303303
->setImplement(Bad4::class);
304304
$builder->complete();
305-
}, Nette\InvalidStateException::class, "Service 'one' (type of Bad4): Unused parameter \$baz when implementing method Bad4::create(), did you mean \$bar?");
305+
}, Nette\InvalidStateException::class, "Service 'one' (type of Bad4): Cannot implement Bad4::create(): factory method parameters (\$baz) are not matching Bad3::__construct() parameters (\$bar). Did you mean to use '\$bar' in factory method?");
306306

307307

308308

@@ -323,7 +323,7 @@ Assert::exception(function () {
323323
$builder->addFactoryDefinition('one')
324324
->setImplement(Bad6::class);
325325
$builder->complete();
326-
}, Nette\InvalidStateException::class, "Service 'one' (type of Bad6): Unused parameter \$baz when implementing method Bad6::create().");
326+
}, Nette\InvalidStateException::class, "Service 'one' (type of Bad6): Cannot implement Bad6::create(): factory method parameters (\$baz) are not matching Bad5::__construct() parameters (\$xxx).");
327327

328328

329329

0 commit comments

Comments
 (0)