From fbfc792ef6f6336a9b0cf1432a22c62959d9b83b Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 22 Sep 2026 22:16:14 +0200 Subject: [PATCH] [symfony] remove NoAbstractControllerConstructorRule, too strict --- README.md | 40 ------------- config/symfony-rules.neon | 1 - .../RuleIdentifier/SymfonyRuleIdentifier.php | 2 - .../NoAbstractControllerConstructorRule.php | 60 ------------------- .../Fixture/SkipNonAbstractController.php | 12 ---- .../Fixture/SomeAbstractController.php | 12 ---- ...oAbstractControllerConstructorRuleTest.php | 41 ------------- 7 files changed, 168 deletions(-) delete mode 100644 src/Rules/Symfony/NoAbstractControllerConstructorRule.php delete mode 100644 tests/Rules/Symfony/NoAbstractControllerConstructorRule/Fixture/SkipNonAbstractController.php delete mode 100644 tests/Rules/Symfony/NoAbstractControllerConstructorRule/Fixture/SomeAbstractController.php delete mode 100644 tests/Rules/Symfony/NoAbstractControllerConstructorRule/NoAbstractControllerConstructorRuleTest.php diff --git a/README.md b/README.md index 512cb83dc..b04b577c0 100644 --- a/README.md +++ b/README.md @@ -1993,46 +1993,6 @@ return static function (ContainerConfigurator $containerConfigurator): void {
-### NoAbstractControllerConstructorRule - -Abstract controller should not have constructor, as it can lead to tight coupling. Use @required annotation instead - -```yaml -rules: - - Symplify\PHPStanRules\Rules\Symfony\NoAbstractControllerConstructorRule -``` - -```php -abstract class AbstractController extends Controller -{ - public function __construct( - private SomeService $someService - ) { - } -} -``` - -:x: - -
- -```php -abstract class AbstractController extends Controller -{ - private $someService; - - #[Required] - public function autowireAbstractController(SomeService $someService) - { - $this->someService = $someService; - } -} -``` - -:+1: - -
- ### AlreadyRegisteredAutodiscoveryServiceRule Remove service, as already registered via autodiscovery ->load(), no need to set it twice. diff --git a/config/symfony-rules.neon b/config/symfony-rules.neon index cefde8013..d79e87033 100644 --- a/config/symfony-rules.neon +++ b/config/symfony-rules.neon @@ -1,5 +1,4 @@ rules: - - Symplify\PHPStanRules\Rules\Symfony\NoAbstractControllerConstructorRule - Symplify\PHPStanRules\Rules\Symfony\NoRequiredOutsideClassRule - Symplify\PHPStanRules\Rules\Symfony\SingleArgEventDispatchRule - Symplify\PHPStanRules\Rules\Symfony\NoListenerWithoutContractRule diff --git a/src/Enum/RuleIdentifier/SymfonyRuleIdentifier.php b/src/Enum/RuleIdentifier/SymfonyRuleIdentifier.php index 56be02675..2b648e89b 100644 --- a/src/Enum/RuleIdentifier/SymfonyRuleIdentifier.php +++ b/src/Enum/RuleIdentifier/SymfonyRuleIdentifier.php @@ -20,8 +20,6 @@ final class SymfonyRuleIdentifier public const string NO_STRING_IN_GET_SUBSCRIBED_EVENTS = 'symfony.noStringInGetSubscribedEvents'; - public const string SYMFONY_NO_ABSTRACT_CONTROLLER_CONSTRUCTOR = 'symfony.noAbstractControllerConstructor'; - public const string SINGLE_REQUIRED_METHOD = 'symfony.singleRequiredMethod'; public const string SYMFONY_REQUIRED_ONLY_IN_ABSTRACT = 'symfony.requiredOnlyInAbstract'; diff --git a/src/Rules/Symfony/NoAbstractControllerConstructorRule.php b/src/Rules/Symfony/NoAbstractControllerConstructorRule.php deleted file mode 100644 index 9228931e4..000000000 --- a/src/Rules/Symfony/NoAbstractControllerConstructorRule.php +++ /dev/null @@ -1,60 +0,0 @@ - - */ -final class NoAbstractControllerConstructorRule implements Rule -{ - public const string ERROR_MESSAGE = 'Abstract controller should not have constructor, to avoid override by child classes. Use #[Require] or @require and autowire() method instead'; - - public function getNodeType(): string - { - return Class_::class; - } - - /** - * @param Class_ $node - */ - public function processNode(Node $node, Scope $scope): array - { - if (! $node->isAbstract()) { - return []; - } - - if (! $node->name instanceof Identifier) { - return []; - } - - $className = $node->name->toString(); - if (! str_ends_with($className, 'Controller')) { - return []; - } - - if (! $node->getMethod('__construct')) { - return []; - } - - $identifierRuleError = RuleErrorBuilder::message(self::ERROR_MESSAGE) - ->identifier(SymfonyRuleIdentifier::SYMFONY_NO_ABSTRACT_CONTROLLER_CONSTRUCTOR) - ->build(); - - return [$identifierRuleError]; - } -} diff --git a/tests/Rules/Symfony/NoAbstractControllerConstructorRule/Fixture/SkipNonAbstractController.php b/tests/Rules/Symfony/NoAbstractControllerConstructorRule/Fixture/SkipNonAbstractController.php deleted file mode 100644 index 074f67ca5..000000000 --- a/tests/Rules/Symfony/NoAbstractControllerConstructorRule/Fixture/SkipNonAbstractController.php +++ /dev/null @@ -1,12 +0,0 @@ -> $expectedErrorMessagesWithLines - */ - #[DataProvider('provideData')] - public function testRule(string $filePath, array $expectedErrorMessagesWithLines): void - { - $this->analyse([$filePath], $expectedErrorMessagesWithLines); - } - - /** - * @return Iterator, mixed>> - */ - public static function provideData(): Iterator - { - yield [__DIR__ . '/Fixture/SomeAbstractController.php', [[ - NoAbstractControllerConstructorRule::ERROR_MESSAGE, - 7, - ]]]; - - yield [__DIR__ . '/Fixture/SkipNonAbstractController.php', []]; - } - - protected function getRule(): Rule - { - return new NoAbstractControllerConstructorRule(); - } -}