From 9334a93ad479889da7806a93078f11b1d3a95d08 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Tue, 6 Feb 2024 00:52:18 +0100 Subject: [PATCH] LocatorDefinition: removed support for create($name) methods (BC break) --- src/DI/Definitions/LocatorDefinition.php | 8 +-- tests/DI/Compiler.generatedLocator.phpt | 23 +------ .../DI/Definitions.LocatorDefinition.api.phpt | 13 ---- ...tions.LocatorDefinition.render.create.phpt | 64 ------------------- 4 files changed, 4 insertions(+), 104 deletions(-) delete mode 100644 tests/DI/Definitions.LocatorDefinition.render.create.phpt diff --git a/src/DI/Definitions/LocatorDefinition.php b/src/DI/Definitions/LocatorDefinition.php index 4e7170e34..6c9d96628 100644 --- a/src/DI/Definitions/LocatorDefinition.php +++ b/src/DI/Definitions/LocatorDefinition.php @@ -35,7 +35,7 @@ public function setImplement(string $interface): static foreach ($methods as $method) { if ($method->isStatic() || !( - (preg_match('#^(get|create)$#', $method->name) && $method->getNumberOfParameters() === 1) + ($method->name === 'get' && $method->getNumberOfParameters() === 1) || (preg_match('#^(get|create)[A-Z]#', $method->name) && $method->getNumberOfParameters() === 0) )) { throw new Nette\InvalidArgumentException(sprintf( @@ -46,15 +46,13 @@ public function setImplement(string $interface): static )); } - if ($method->getNumberOfParameters() === 0) { + if ($method->name !== 'get') { Nette\DI\Helpers::ensureClassType( Nette\Utils\Type::fromReflection($method), "return type of $interface::$method->name()", $this->getDescriptor(), allowNullable: true, ); - } elseif (str_starts_with($method->name, 'create')) { - trigger_error(sprintf("Service '%s': Method %s::create(\$name) is deprecated, use createFoo().", $this->getName(), $interface), E_USER_DEPRECATED); } } @@ -155,7 +153,7 @@ public function generateMethod(Nette\PhpGenerator\Method $method, Nette\DI\PhpGe $methodInner->setBody('if (!isset($this->mapping[$name])) { ' . ($nullable ? 'return null;' : 'throw new Nette\DI\MissingServiceException("Service \'$name\' is not defined.");') . ' } -return $this->container->' . $m[1] . 'Service($this->mapping[$name]);') +return $this->container->getService($this->mapping[$name]);') ->addParameter('name'); } elseif (isset($this->references[$name])) { diff --git a/tests/DI/Compiler.generatedLocator.phpt b/tests/DI/Compiler.generatedLocator.phpt index 940f25432..d33b219c5 100644 --- a/tests/DI/Compiler.generatedLocator.phpt +++ b/tests/DI/Compiler.generatedLocator.phpt @@ -42,8 +42,7 @@ interface LocatorFactoryN } -// create($name) is deprecated -$container = @createContainer(new DI\Compiler, ' +$container = createContainer(new DI\Compiler, ' services: - LoremChild @@ -64,10 +63,7 @@ services: one: Locator(a: @lorem1, b: LoremChild) two: Locator(tagged: a) - three: LocatorFactory(a: @lorem1, b: LoremChild) - four: LocatorFactory(tagged: b) five: LocatorN(tagged: a) - six: LocatorFactoryN(tagged: a) seven: Locator(a: @lorem1) eight: Locator(a: LoremChild()) '); @@ -96,29 +92,12 @@ Assert::exception( "Service '3' is not defined.", ); -// factory -$three = $container->getService('three'); -Assert::type(Lorem::class, $three->create('a')); -Assert::type(LoremChild::class, $three->create('b')); -Assert::notSame($three->create('a'), $three->create('a')); - -// tagged factory -$four = $container->getService('four'); -Assert::type(Lorem::class, $four->create('3')); -Assert::notSame($container->getService('lorem3'), $four->create('3')); - // nullable accessor $five = $container->getService('five'); Assert::type(Lorem::class, $five->get('1')); Assert::type(Lorem::class, $five->get('2')); Assert::null($five->get('3')); -// nullable factory -$six = $container->getService('six'); -Assert::type(Lorem::class, $six->create('1')); -Assert::type(Lorem::class, $six->create('2')); -Assert::null($six->create('3')); - // accessor with one service $one = $container->getService('seven'); Assert::type(Lorem::class, $one->get('a')); diff --git a/tests/DI/Definitions.LocatorDefinition.api.phpt b/tests/DI/Definitions.LocatorDefinition.api.phpt index daa75622a..826eaa44e 100644 --- a/tests/DI/Definitions.LocatorDefinition.api.phpt +++ b/tests/DI/Definitions.LocatorDefinition.api.phpt @@ -50,11 +50,6 @@ interface Good1 public function get($name); } -interface Good2 -{ - public function create($name); -} - interface Good3 { public function createA(): stdClass; @@ -127,14 +122,6 @@ Assert::noError(function () { }); -Assert::noError(function () { - $def = new LocatorDefinition; - @$def->setImplement(Good2::class); // create($name) is deprecated - Assert::same(Good2::class, $def->getImplement()); - Assert::same(Good2::class, $def->getType()); -}); - - Assert::noError(function () { $def = new LocatorDefinition; $def->setImplement(Good3::class); diff --git a/tests/DI/Definitions.LocatorDefinition.render.create.phpt b/tests/DI/Definitions.LocatorDefinition.render.create.phpt deleted file mode 100644 index 833fdbf75..000000000 --- a/tests/DI/Definitions.LocatorDefinition.render.create.phpt +++ /dev/null @@ -1,64 +0,0 @@ -setName('abc'); - @$def->setImplement(Good::class); // create($name) is deprecated - $def->setReferences(['first' => '@a', 'second' => 'stdClass']); - - $builder = new Nette\DI\ContainerBuilder; - $builder->addDefinition('a')->setType(stdClass::class); - $resolver = new Nette\DI\Resolver($builder); - - $resolver->resolveDefinition($def); - $resolver->completeDefinition($def); - - $phpGenerator = new Nette\DI\PhpGenerator($builder); - $method = $phpGenerator->generateMethod($def); - - Assert::match( - <<<'XX' - public function createServiceAbc(): Good - { - return new class ($this) implements Good { - private $mapping = ['first' => 'a', 'second' => 'a']; - - - public function __construct( - private $container, - ) { - } - - - public function create($name): stdClass - { - if (!isset($this->mapping[$name])) { - throw new Nette\DI\MissingServiceException("Service '$name' is not defined."); - } - return $this->container->createService($this->mapping[$name]); - } - }; - } - XX, - $method->__toString(), - ); -});