diff --git a/rules-tests/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector/Fixture/keep_class_route_attribute.php.inc b/rules-tests/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector/Fixture/keep_class_route_attribute.php.inc new file mode 100644 index 000000000..e1b33926f --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector/Fixture/keep_class_route_attribute.php.inc @@ -0,0 +1,35 @@ + +----- + diff --git a/rules-tests/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector/Fixture/with_existing_name2.php.inc b/rules-tests/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector/Fixture/with_existing_name2.php.inc index 1191d193e..d541d75c8 100644 --- a/rules-tests/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector/Fixture/with_existing_name2.php.inc +++ b/rules-tests/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector/Fixture/with_existing_name2.php.inc @@ -23,6 +23,7 @@ namespace Rector\Symfony\Tests\CodeQuality\Rector\Class_\InlineClassRoutePrefixR use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\Routing\Annotation\Route; +#[\Symfony\Component\Routing\Attribute\Route(name: "some_org.")] final class WithExistingName2 extends Controller { #[\Symfony\Component\Routing\Attribute\Route('/city/street', name: 'some_org.some')] diff --git a/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php b/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php index 3b53c7ee7..23891daa6 100644 --- a/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php +++ b/rules/CodeQuality/Rector/Class_/InlineClassRoutePrefixRector.php @@ -61,7 +61,7 @@ public function getRuleDefinition(): RuleDefinition use Symfony\Component\Routing\Annotation\Route; /** - * @Route("/api") + * @Route("/api", name="api_") */ class SomeController { @@ -77,6 +77,9 @@ public function action() <<<'CODE_SAMPLE' use Symfony\Component\Routing\Annotation\Route; +/** + * @Route(name="api_") + */ class SomeController { /** @@ -189,7 +192,7 @@ public function refactor(Node $node): ?Class_ continue; } - if ($methodRouteArg->name->toString() === 'name') { + if ($this->isName($methodRouteArg->name, 'name')) { if (! $methodRouteArg->value instanceof String_) { continue; } @@ -220,7 +223,27 @@ public function refactor(Node $node): ?Class_ } else { foreach ($node->attrGroups as $attrGroupKey => $attrGroup) { foreach ($attrGroup->attrs as $attribute) { - if ($attribute === $routeAttributeOrAnnotation) { + if ($attribute !== $routeAttributeOrAnnotation) { + continue; + } + + // keep attribute if there are other parameters set + $attrGroup = $node->attrGroups[$attrGroupKey]; + foreach ($attrGroup->attrs as $attributeKey => $attribute) { + foreach ($attribute->args as $attributeArgKey => $attributeArg) { + // silent or "path" + if ($attributeArg->name === null || $attributeArg->name->toString() === self::PATH) { + unset($attribute->args[$attributeArgKey]); + } + } + + // nothing to keep, remove whole attribute + if ($attribute->args === []) { + unset($attrGroup->attrs[$attributeKey]); + } + } + + if ($attrGroup->attrs === []) { unset($node->attrGroups[$attrGroupKey]); } }