From 61cfa21ac94fe1a34b8975e1f29f082cd71573cf Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 24 Sep 2026 23:22:13 +0200 Subject: [PATCH] [symfony] Skip Symfony\Component\Mailer\Transport in PreferInterfaceInConstructorRule --- src/Enum/SymfonyClass.php | 2 ++ .../Symfony/PreferInterfaceInConstructorRule.php | 10 ++++++++++ stubs/Symfony/Component/Mailer/Transport.php | 11 +++++++++++ .../Component/Mailer/TransportInterface.php | 11 +++++++++++ .../Fixture/SkipMailerTransport.php | 15 +++++++++++++++ .../PreferInterfaceInConstructorRuleTest.php | 1 + 6 files changed, 50 insertions(+) create mode 100644 stubs/Symfony/Component/Mailer/Transport.php create mode 100644 stubs/Symfony/Component/Mailer/TransportInterface.php create mode 100644 tests/Rules/Symfony/PreferInterfaceInConstructorRule/Fixture/SkipMailerTransport.php diff --git a/src/Enum/SymfonyClass.php b/src/Enum/SymfonyClass.php index 78b657f3..353f8865 100644 --- a/src/Enum/SymfonyClass.php +++ b/src/Enum/SymfonyClass.php @@ -41,4 +41,6 @@ final class SymfonyClass public const string CONTAINER_CONFIGURATOR = 'Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator'; public const string IS_GRANTED = 'Symfony\Component\Security\Http\Attribute\IsGranted'; + + public const string MAILER_TRANSPORT = 'Symfony\Component\Mailer\Transport'; } diff --git a/src/Rules/Symfony/PreferInterfaceInConstructorRule.php b/src/Rules/Symfony/PreferInterfaceInConstructorRule.php index 4e4c05c4..ee88b536 100644 --- a/src/Rules/Symfony/PreferInterfaceInConstructorRule.php +++ b/src/Rules/Symfony/PreferInterfaceInConstructorRule.php @@ -14,6 +14,7 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use Symplify\PHPStanRules\Enum\RuleIdentifier; +use Symplify\PHPStanRules\Enum\SymfonyClass; /** * A constructor dependency must be autowired by its interface, not by the concrete class. @@ -38,6 +39,11 @@ */ private const array HANDLED_NAMESPACE_PREFIXES = ['Symfony\\', 'Doctrine\\']; + /** + * @var string[] + */ + private const array SKIPPED_CLASSES = [SymfonyClass::MAILER_TRANSPORT]; + public function __construct( private ReflectionProvider $reflectionProvider, ) { @@ -96,6 +102,10 @@ private function matchImplementedSameNamedInterface(string $className): ?string return null; } + if (in_array($className, self::SKIPPED_CLASSES, true)) { + return null; + } + if (! $this->reflectionProvider->hasClass($className)) { return null; } diff --git a/stubs/Symfony/Component/Mailer/Transport.php b/stubs/Symfony/Component/Mailer/Transport.php new file mode 100644 index 00000000..a690982b --- /dev/null +++ b/stubs/Symfony/Component/Mailer/Transport.php @@ -0,0 +1,11 @@ +