diff --git a/src/DI/Resolver.php b/src/DI/Resolver.php index e85f70a09..04af773d2 100644 --- a/src/DI/Resolver.php +++ b/src/DI/Resolver.php @@ -130,7 +130,7 @@ public function resolveEntityType(Statement $statement): ?string $this->addDependency($reflection); $type = Nette\Utils\Type::fromReflection($reflection) ?? Helpers::getReturnTypeAnnotation($reflection); - if ($type) { + if ($type && !in_array((string) $type, ['object', 'mixed'])) { return Helpers::ensureClassType($type, sprintf('return type of %s()', Callback::toString($entity))); } diff --git a/tests/DI/ContainerBuilder.resolveTypes.phpt b/tests/DI/ContainerBuilder.resolveTypes.phpt index 17a7f4afe..81e9cb9a3 100644 --- a/tests/DI/ContainerBuilder.resolveTypes.phpt +++ b/tests/DI/ContainerBuilder.resolveTypes.phpt @@ -60,6 +60,12 @@ class Factory } + public function createObjectNullable(): ?object + { + return (object) null; + } + + /** @return mixed */ public function createMixedPhpDoc() { @@ -141,7 +147,14 @@ Assert::exception(function () { $builder->addDefinition('a') ->setFactory([Factory::class, 'createObject']); $container = createContainer($builder); -}, Nette\DI\ServiceCreationException::class, "Service 'a': Return type of Factory::createObject() is not expected to be nullable/union/intersection/built-in, 'object' given."); +}, Nette\DI\ServiceCreationException::class, "Service 'a': Unknown service type, specify it or declare return type of factory."); + +Assert::exception(function () { + $builder = new DI\ContainerBuilder; + $builder->addDefinition('a') + ->setFactory([Factory::class, 'createObjectNullable']); + $container = createContainer($builder); +}, Nette\DI\ServiceCreationException::class, "Service 'a': Return type of Factory::createObjectNullable() is not expected to be nullable/union/intersection/built-in, '?object' given."); Assert::exception(function () { $builder = new DI\ContainerBuilder; @@ -155,7 +168,7 @@ Assert::exception(function () { $builder->addDefinition('a') ->setFactory([Factory::class, 'createMixed']); $container = createContainer($builder); -}, Nette\DI\ServiceCreationException::class, "Service 'a': Return type of Factory::createMixed() is not expected to be nullable/union/intersection/built-in, 'mixed' given."); +}, Nette\DI\ServiceCreationException::class, "Service 'a': Unknown service type, specify it or declare return type of factory."); Assert::exception(function () { $builder = new DI\ContainerBuilder;