From 3df9c0411207672459e365016e3e3ac357d0c7b3 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 16 Sep 2026 16:42:42 +0200 Subject: [PATCH] [Symfony30] Reuse existing untyped $request param in GetRequestRector --- .../reuse_untyped_request_param.php.inc | 39 +++++++++++++++++++ .../Rector/ClassMethod/GetRequestRector.php | 38 +++++++++++++++--- 2 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 rules-tests/Symfony30/Rector/ClassMethod/GetRequestRector/Fixture/reuse_untyped_request_param.php.inc diff --git a/rules-tests/Symfony30/Rector/ClassMethod/GetRequestRector/Fixture/reuse_untyped_request_param.php.inc b/rules-tests/Symfony30/Rector/ClassMethod/GetRequestRector/Fixture/reuse_untyped_request_param.php.inc new file mode 100644 index 00000000..15b081f2 --- /dev/null +++ b/rules-tests/Symfony30/Rector/ClassMethod/GetRequestRector/Fixture/reuse_untyped_request_param.php.inc @@ -0,0 +1,39 @@ +getRequest()->getSomething(); + } +} + +?> +----- +getSomething(); + } +} + +?> diff --git a/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php b/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php index 13b91296..88f06f09 100644 --- a/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php +++ b/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php @@ -109,6 +109,25 @@ public function refactor(Node $node): ?Node return null; } + private function resolveExistingUntypedRequestParam(ClassMethod $classMethod): ?Param + { + foreach ($classMethod->params as $param) { + if ($param->type !== null) { + continue; + } + + if (! $param->var instanceof Variable) { + continue; + } + + if ($this->isName($param->var, 'request')) { + return $param; + } + } + + return null; + } + private function resolveUniqueName(ClassMethod $classMethod, string $name): string { $candidateNames = []; @@ -239,16 +258,23 @@ private function getRequestVariableAndParamName(): string private function refactorClassMethod(ClassMethod $classMethod): null|ClassMethod { - $this->requestVariableAndParamName = $this->resolveUniqueName($classMethod, 'request'); - if (! $this->isActionWithGetRequestInBody($classMethod)) { return null; } - $fullyQualified = new FullyQualified(SymfonyClass::REQUEST); - $classMethod->params[] = new Param(new Variable( - $this->getRequestVariableAndParamName() - ), null, $fullyQualified); + $existingUntypedRequestParam = $this->resolveExistingUntypedRequestParam($classMethod); + if ($existingUntypedRequestParam instanceof Param) { + // reuse an already present, untyped $request param instead of adding a duplicate + $existingUntypedRequestParam->type = new FullyQualified(SymfonyClass::REQUEST); + $this->requestVariableAndParamName = $this->getName($existingUntypedRequestParam); + } else { + $this->requestVariableAndParamName = $this->resolveUniqueName($classMethod, 'request'); + + $fullyQualified = new FullyQualified(SymfonyClass::REQUEST); + $classMethod->params[] = new Param(new Variable( + $this->getRequestVariableAndParamName() + ), null, $fullyQualified); + } $this->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $node) use ( $classMethod