diff --git a/src/DI/Definitions/FactoryDefinition.php b/src/DI/Definitions/FactoryDefinition.php index e7362d49a..4916ffd6d 100644 --- a/src/DI/Definitions/FactoryDefinition.php +++ b/src/DI/Definitions/FactoryDefinition.php @@ -216,12 +216,22 @@ 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 = function (array $params): string { + return implode(', ', array_map( + function (string $param) { return '$' . $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, - $interface - ) . ($hint ? ", did you mean \${$hint}?" : '.')); + 'Cannot implement %s::create(): factory method parameters (%s) are not matching %s::__construct() parameters (%s).', + $interface, + $stringifyParams(array_map(function (\ReflectionParameter $param) { return $param->name; }, $method->getParameters())), + $class, + $stringifyParams($ctorParamsKeys) + ) . ($hint ? " Did you mean to use '\${$hint}' in factory method?" : '')); } $paramDef = $methodType . ' ' . $param->name; diff --git a/tests/DI/Compiler.generatedFactory.phpt b/tests/DI/Compiler.generatedFactory.phpt index 5e1746973..40a2026ed 100644 --- a/tests/DI/Compiler.generatedFactory.phpt +++ b/tests/DI/Compiler.generatedFactory.phpt @@ -302,7 +302,7 @@ Assert::exception(function () { $builder->addFactoryDefinition('one') ->setImplement(Bad4::class); $builder->complete(); -}, Nette\InvalidStateException::class, "Service 'one' (type of Bad4): Unused parameter \$baz when implementing method Bad4::create(), did you mean \$bar?"); +}, 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?"); @@ -323,7 +323,7 @@ Assert::exception(function () { $builder->addFactoryDefinition('one') ->setImplement(Bad6::class); $builder->complete(); -}, Nette\InvalidStateException::class, "Service 'one' (type of Bad6): Unused parameter \$baz when implementing method Bad6::create()."); +}, Nette\InvalidStateException::class, "Service 'one' (type of Bad6): Cannot implement Bad6::create(): factory method parameters (\$baz) are not matching Bad5::__construct() parameters (\$xxx).");