From c8ef8f12fd1d032de4c1153b4038dd765cbc2d10 Mon Sep 17 00:00:00 2001 From: dakur Date: Thu, 19 Jan 2023 16:36:52 +0100 Subject: [PATCH] more self explanatory message for factory and service mismatch (closes #199) (#284) --- src/DI/Definitions/FactoryDefinition.php | 16 ++++++++++++---- tests/DI/Compiler.generatedFactory.phpt | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/DI/Definitions/FactoryDefinition.php b/src/DI/Definitions/FactoryDefinition.php index 354487f5b..a679f8ea0 100644 --- a/src/DI/Definitions/FactoryDefinition.php +++ b/src/DI/Definitions/FactoryDefinition.php @@ -168,12 +168,20 @@ private function completeParameters(Nette\DI\Resolver $resolver): void $this->resultDefinition->getCreator()->arguments[$ctorParam->getPosition()] = new Php\Literal('$' . $ctorParam->name); } elseif (!$this->resultDefinition->getSetup()) { - $hint = Nette\Utils\Helpers::getSuggestion(array_keys($ctorParams), $param->name); + // [param1, param2] => '$param1, $param2' + $stringifyParams = static fn(array $params): string => implode(', ', array_map( + static fn(string $param): string => sprintf('$%s', $param), + $params, + )); + $ctorParamsKeys = array_keys($ctorParams); + $hint = Nette\Utils\Helpers::getSuggestion($ctorParamsKeys, $param->name); throw new ServiceCreationException(sprintf( - 'Unused parameter $%s when implementing method %s::create()', - $param->name, + 'Cannot implement %s::create(): factory method parameters (%s) are not matching %s::__construct() parameters (%s).', $interface, - ) . ($hint ? ", did you mean \${$hint}?" : '.')); + $stringifyParams(array_map(static fn(\ReflectionParameter $param): string => $param->name, $method->getParameters())), + $class, + $stringifyParams($ctorParamsKeys), + ) . ($hint ? " Did you mean to use '\${$hint}' in factory method?" : '')); } } } diff --git a/tests/DI/Compiler.generatedFactory.phpt b/tests/DI/Compiler.generatedFactory.phpt index 3b70b1761..eac013e90 100644 --- a/tests/DI/Compiler.generatedFactory.phpt +++ b/tests/DI/Compiler.generatedFactory.phpt @@ -289,7 +289,7 @@ Assert::exception(function () { ->setImplement(Bad4::class); $builder->complete(); }, Nette\InvalidStateException::class, "[Service 'one' of type Bad4] -Unused parameter \$baz when implementing method Bad4::create(), did you mean \$bar?"); +Cannot implement Bad4::create(): factory method parameters (\$baz) are not matching Bad3::__construct() parameters (\$bar). Did you mean to use '\$bar' in factory method?"); @@ -311,4 +311,4 @@ Assert::exception(function () { ->setImplement(Bad6::class); $builder->complete(); }, Nette\InvalidStateException::class, "[Service 'one' of type Bad6] -Unused parameter \$baz when implementing method Bad6::create()."); +Cannot implement Bad6::create(): factory method parameters (\$baz) are not matching Bad5::__construct() parameters (\$xxx).");