diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 4b206aecc..56dff292b 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -39,13 +39,7 @@ jobs: php-version: "7.4" symfony-deprecations-helper: "weak" - # Test legacy LTS - - symfony-require: "4.4.*" - dependencies: "stable" - php-version: "7.4" - symfony-deprecations-helper: "weak" - - # Test latest LTS + # Test LTS - symfony-require: "5.4.*" dependencies: "highest" php-version: "8.0" @@ -82,7 +76,7 @@ jobs: - name: "Require symfony/messenger" run: "composer require --dev symfony/messenger --no-update" - if: "${{ startsWith(matrix.symfony-require, '4.') }}" + if: "${{ startsWith(matrix.symfony-require, '5.') }}" - name: "Enforce using stable dependencies" run: "composer config minimum-stability stable" diff --git a/DependencyInjection/Compiler/CacheSchemaSubscriberPass.php b/DependencyInjection/Compiler/CacheSchemaSubscriberPass.php index 359ad98fd..7f519031c 100644 --- a/DependencyInjection/Compiler/CacheSchemaSubscriberPass.php +++ b/DependencyInjection/Compiler/CacheSchemaSubscriberPass.php @@ -20,8 +20,6 @@ class CacheSchemaSubscriberPass implements CompilerPassInterface */ public function process(ContainerBuilder $container) { - // available in Symfony 5.4 and higher - /** @psalm-suppress UndefinedClass */ $this->injectAdapters($container, 'doctrine.orm.listeners.doctrine_dbal_cache_adapter_schema_subscriber', DoctrineDbalAdapter::class); // available in Symfony 5.1 and up to Symfony 5.4 (deprecated) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 831a2b13d..43252e84a 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -7,7 +7,6 @@ use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Mapping\ClassMetadataFactory; use ReflectionClass; -use Symfony\Component\Config\Definition\BaseNode; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; @@ -30,7 +29,6 @@ use function is_int; use function is_string; use function key; -use function method_exists; use function reset; use function sprintf; use function strlen; @@ -115,7 +113,9 @@ private function addDbalSection(ArrayNodeDefinition $node): void ->scalarNode('class')->isRequired()->end() ->booleanNode('commented') ->setDeprecated( - ...$this->getDeprecationMsg('The doctrine-bundle type commenting features were removed; the corresponding config parameter was deprecated in 2.0 and will be dropped in 3.0.', '2.0') + 'doctrine/doctrine-bundle', + '2.0', + 'The doctrine-bundle type commenting features were removed; the corresponding config parameter was deprecated in 2.0 and will be dropped in 3.0.', ) ->end() ->end() @@ -173,7 +173,9 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition ->scalarNode('wrapper_class')->end() ->booleanNode('keep_slave') ->setDeprecated( - ...$this->getDeprecationMsg('The "keep_slave" configuration key is deprecated since doctrine-bundle 2.2. Use the "keep_replica" configuration key instead.', '2.2') + 'doctrine/doctrine-bundle', + '2.2', + 'The "keep_slave" configuration key is deprecated since doctrine-bundle 2.2. Use the "keep_replica" configuration key instead.', ) ->end() ->booleanNode('keep_replica')->end() @@ -200,7 +202,9 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition ->children() ->arrayNode('slaves') ->setDeprecated( - ...$this->getDeprecationMsg('The "slaves" configuration key will be renamed to "replicas" in doctrine-bundle 3.0. "slaves" is deprecated since doctrine-bundle 2.2.', '2.2') + 'doctrine/doctrine-bundle', + '2.2', + 'The "slaves" configuration key will be renamed to "replicas" in doctrine-bundle 3.0. "slaves" is deprecated since doctrine-bundle 2.2.', ) ->useAttributeAsKey('name') ->prototype('array'); @@ -255,7 +259,11 @@ private function configureDbalDriverNode(ArrayNodeDefinition $node): void ->scalarNode('port')->info('Defaults to null at runtime.')->end() ->scalarNode('user')->info('Defaults to "root" at runtime.')->end() ->scalarNode('password')->info('Defaults to null at runtime.')->end() - ->booleanNode('override_url')->setDeprecated(...$this->getDeprecationMsg('The "doctrine.dbal.override_url" configuration key is deprecated.', '2.4'))->end() + ->booleanNode('override_url')->setDeprecated( + 'doctrine/doctrine-bundle', + '2.4', + 'The "doctrine.dbal.override_url" configuration key is deprecated.', + )->end() ->scalarNode('dbname_suffix')->end() ->scalarNode('application_name')->end() ->scalarNode('charset')->end() @@ -775,27 +783,4 @@ private function getAutoGenerateModes(): array 'values' => $valuesArray, ]; } - - /** - * Returns the correct deprecation param's as an array for setDeprecated. - * - * Symfony/Config v5.1 introduces a deprecation notice when calling - * setDeprecation() with less than 3 args and the getDeprecation method was - * introduced at the same time. By checking if getDeprecation() exists, - * we can determine the correct param count to use when calling setDeprecated. - * - * @return list|array{0:string, 1: numeric-string, string} - */ - private function getDeprecationMsg(string $message, string $version): array - { - if (method_exists(BaseNode::class, 'getDeprecation')) { - return [ - 'doctrine/doctrine-bundle', - $version, - $message, - ]; - } - - return [$message]; - } } diff --git a/DependencyInjection/DoctrineExtension.php b/DependencyInjection/DoctrineExtension.php index 525c75b50..2354db537 100644 --- a/DependencyInjection/DoctrineExtension.php +++ b/DependencyInjection/DoctrineExtension.php @@ -31,14 +31,8 @@ use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator; -use Symfony\Bridge\Doctrine\Messenger\DoctrineClearEntityManagerWorkerSubscriber; -use Symfony\Bridge\Doctrine\Messenger\DoctrineTransactionMiddleware; -use Symfony\Bridge\Doctrine\Middleware\Debug\Middleware as SfDebugMiddleware; use Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor; -use Symfony\Bridge\Doctrine\SchemaListener\DoctrineDbalCacheAdapterSchemaSubscriber; -use Symfony\Bridge\Doctrine\SchemaListener\MessengerTransportDoctrineSchemaSubscriber; use Symfony\Bridge\Doctrine\SchemaListener\PdoCacheAdapterDoctrineSchemaSubscriber; -use Symfony\Bridge\Doctrine\SchemaListener\RememberMeTokenProviderDoctrineSchemaSubscriber; use Symfony\Bridge\Doctrine\Validator\DoctrineLoader; use Symfony\Component\Cache\Adapter\ArrayAdapter; use Symfony\Component\Cache\Adapter\PhpArrayAdapter; @@ -51,7 +45,6 @@ use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Messenger\Bridge\Doctrine\Transport\DoctrineTransportFactory; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface; use Symfony\Component\Validator\Mapping\Loader\LoaderInterface; @@ -61,13 +54,10 @@ use function class_exists; use function interface_exists; use function is_dir; -use function method_exists; use function reset; use function sprintf; use function str_replace; -use const PHP_VERSION_ID; - /** * DoctrineExtension is an extension for the Doctrine DBAL and ORM library. */ @@ -158,19 +148,17 @@ protected function dbalLoad(array $config, ContainerBuilder $container) $container->registerForAutoconfiguration(MiddlewareInterface::class)->addTag('doctrine.middleware'); - if (PHP_VERSION_ID >= 80000 && method_exists(ContainerBuilder::class, 'registerAttributeForAutoconfiguration')) { - $container->registerAttributeForAutoconfiguration(AsMiddleware::class, static function (ChildDefinition $definition, AsMiddleware $attribute) { - if ($attribute->connections === []) { - $definition->addTag('doctrine.middleware'); + $container->registerAttributeForAutoconfiguration(AsMiddleware::class, static function (ChildDefinition $definition, AsMiddleware $attribute) { + if ($attribute->connections === []) { + $definition->addTag('doctrine.middleware'); - return; - } + return; + } - foreach ($attribute->connections as $connName) { - $definition->addTag('doctrine.middleware', ['connection' => $connName]); - } - }); - } + foreach ($attribute->connections as $connName) { + $definition->addTag('doctrine.middleware', ['connection' => $connName]); + } + }); $this->useMiddlewaresIfAvailable($container, $connWithLogging, $connWithProfiling, $connWithBacktrace); } @@ -185,24 +173,11 @@ protected function dbalLoad(array $config, ContainerBuilder $container) protected function loadDbalConnection($name, array $connection, ContainerBuilder $container) { $configuration = $container->setDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $name), new ChildDefinition('doctrine.dbal.connection.configuration')); - $logger = null; unset($connection['logging']); $dataCollectorDefinition = $container->getDefinition('data_collector.doctrine'); $dataCollectorDefinition->replaceArgument(1, $connection['profiling_collect_schema_errors']); - if (! $this->isSfDebugMiddlewareAvailable() && $connection['profiling']) { - $profilingAbstractId = $connection['profiling_collect_backtrace'] ? - 'doctrine.dbal.logger.backtrace' : - 'doctrine.dbal.logger.profiling'; - - $profilingLoggerId = $profilingAbstractId . '.' . $name; - $container->setDefinition($profilingLoggerId, new ChildDefinition($profilingAbstractId)); - $profilingLogger = new Reference($profilingLoggerId); - $dataCollectorDefinition->addMethodCall('addLogger', [$name, $profilingLogger]); - $logger = $profilingLogger; - } - unset( $connection['profiling'], $connection['profiling_collect_backtrace'], @@ -223,10 +198,6 @@ protected function loadDbalConnection($name, array $connection, ContainerBuilder unset($connection['schema_filter']); - if ($logger) { - $configuration->addMethodCall('setSQLLogger', [$logger]); - } - // event manager $container->setDefinition(sprintf('doctrine.dbal.%s_connection.event_manager', $name), new ChildDefinition('doctrine.dbal.connection.event_manager')); @@ -400,21 +371,11 @@ protected function ormLoad(array $config, ContainerBuilder $container) $container->getDefinition('form.type.entity')->addTag('kernel.reset', ['method' => 'reset']); } - // available in Symfony 5.4 and higher - if (! class_exists(DoctrineDbalCacheAdapterSchemaSubscriber::class)) { - $container->removeDefinition('doctrine.orm.listeners.doctrine_dbal_cache_adapter_schema_subscriber'); - } - // available in Symfony 5.1 and up to Symfony 5.4 (deprecated) if (! class_exists(PdoCacheAdapterDoctrineSchemaSubscriber::class)) { $container->removeDefinition('doctrine.orm.listeners.pdo_cache_adapter_doctrine_schema_subscriber'); } - // available in Symfony 5.3 and higher - if (! class_exists(RememberMeTokenProviderDoctrineSchemaSubscriber::class)) { - $container->removeDefinition('doctrine.orm.listeners.doctrine_token_provider_schema_subscriber'); - } - if (! class_exists(UlidGenerator::class)) { $container->removeDefinition('doctrine.ulid_generator'); } @@ -535,25 +496,22 @@ protected function ormLoad(array $config, ContainerBuilder $container) $container->registerForAutoconfiguration(AbstractIdGenerator::class) ->addTag(IdGeneratorPass::ID_GENERATOR_TAG); - /** @psalm-suppress RedundantCondition */ - if (method_exists($container, 'registerAttributeForAutoconfiguration')) { - $container->registerAttributeForAutoconfiguration(AsEntityListener::class, static function (ChildDefinition $definition, AsEntityListener $attribute) { - $definition->addTag('doctrine.orm.entity_listener', [ - 'event' => $attribute->event, - 'method' => $attribute->method, - 'lazy' => $attribute->lazy, - 'entity_manager' => $attribute->entityManager, - 'entity' => $attribute->entity, - ]); - }); - $container->registerAttributeForAutoconfiguration(AsEventListener::class, static function (ChildDefinition $definition, AsEventListener $attribute) { - $definition->addTag('doctrine.event_listener', [ - 'event' => $attribute->event, - 'priority' => $attribute->priority, - 'connection' => $attribute->connection, - ]); - }); - } + $container->registerAttributeForAutoconfiguration(AsEntityListener::class, static function (ChildDefinition $definition, AsEntityListener $attribute) { + $definition->addTag('doctrine.orm.entity_listener', [ + 'event' => $attribute->event, + 'method' => $attribute->method, + 'lazy' => $attribute->lazy, + 'entity_manager' => $attribute->entityManager, + 'entity' => $attribute->entity, + ]); + }); + $container->registerAttributeForAutoconfiguration(AsEventListener::class, static function (ChildDefinition $definition, AsEventListener $attribute) { + $definition->addTag('doctrine.event_listener', [ + 'event' => $attribute->event, + 'priority' => $attribute->priority, + 'connection' => $attribute->connection, + ]); + }); /** @see DoctrineBundle::boot() */ $container->getDefinition($defaultEntityManagerDefinitionId) @@ -1034,34 +992,12 @@ private function loadMessengerServices(ContainerBuilder $container): void { // If the Messenger component is installed and the doctrine transaction middleware is available, wire it: /** @psalm-suppress UndefinedClass Optional dependency */ - if (! interface_exists(MessageBusInterface::class) || ! class_exists(DoctrineTransactionMiddleware::class)) { + if (! interface_exists(MessageBusInterface::class)) { return; } $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('messenger.xml'); - - if (! class_exists(DoctrineClearEntityManagerWorkerSubscriber::class)) { - $container->removeDefinition('doctrine.orm.messenger.event_subscriber.doctrine_clear_entity_manager'); - } - - // available in Symfony 5.1 and higher - if (! class_exists(MessengerTransportDoctrineSchemaSubscriber::class)) { - $container->removeDefinition('doctrine.orm.messenger.doctrine_schema_subscriber'); - } - - $transportFactoryDefinition = $container->getDefinition('messenger.transport.doctrine.factory'); - if (! class_exists(DoctrineTransportFactory::class)) { - // If symfony/messenger < 5.1 - if (! class_exists(\Symfony\Component\Messenger\Transport\Doctrine\DoctrineTransportFactory::class)) { - // Dont add the tag - return; - } - - $transportFactoryDefinition->setClass(\Symfony\Component\Messenger\Transport\Doctrine\DoctrineTransportFactory::class); - } - - $transportFactoryDefinition->addTag('messenger.transport_factory'); } private function createArrayAdapterCachePool(ContainerBuilder $container, string $objectManagerName, string $cacheName): string @@ -1098,22 +1034,11 @@ private function useMiddlewaresIfAvailable( $loggingMiddlewareAbstractDef->addTag('doctrine.middleware', ['connection' => $connName]); } - if ($this->isSfDebugMiddlewareAvailable()) { - $container->getDefinition('doctrine.debug_data_holder')->replaceArgument(0, $connWithBacktrace); - $debugMiddlewareAbstractDef = $container->getDefinition('doctrine.dbal.debug_middleware'); - foreach ($connWithProfiling as $connName) { - $debugMiddlewareAbstractDef - ->addTag('doctrine.middleware', ['connection' => $connName]); - } - } else { - $container->removeDefinition('doctrine.dbal.debug_middleware'); - $container->removeDefinition('doctrine.debug_data_holder'); + $container->getDefinition('doctrine.debug_data_holder')->replaceArgument(0, $connWithBacktrace); + $debugMiddlewareAbstractDef = $container->getDefinition('doctrine.dbal.debug_middleware'); + foreach ($connWithProfiling as $connName) { + $debugMiddlewareAbstractDef + ->addTag('doctrine.middleware', ['connection' => $connName]); } } - - private function isSfDebugMiddlewareAvailable(): bool - { - /** @psalm-suppress UndefinedClass */ - return class_exists(SfDebugMiddleware::class); - } } diff --git a/Resources/config/messenger.xml b/Resources/config/messenger.xml index 3388b0d34..a36e9ccb5 100644 --- a/Resources/config/messenger.xml +++ b/Resources/config/messenger.xml @@ -44,6 +44,7 @@ --> + diff --git a/Tests/CacheSchemaSubscriberTest.php b/Tests/CacheSchemaSubscriberTest.php index b15ef6e47..da1f81f17 100644 --- a/Tests/CacheSchemaSubscriberTest.php +++ b/Tests/CacheSchemaSubscriberTest.php @@ -90,11 +90,6 @@ public function testSchemaSubscriberWiring(string $adapterId, string $subscriber public function getSchemaSubscribers(): Generator { - /** - * available in Symfony 5.4 and higher - * - * @psalm-suppress UndefinedClass - */ yield ['cache.adapter.doctrine_dbal', 'doctrine.orm.listeners.doctrine_dbal_cache_adapter_schema_subscriber', DoctrineDbalCacheAdapterSchemaSubscriber::class]; /** diff --git a/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php b/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php index 93d04f28d..95c3a633d 100644 --- a/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php +++ b/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php @@ -31,7 +31,6 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ServiceLocator; -use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Security\Core\User\UserInterface; use function array_filter; @@ -42,13 +41,11 @@ use function end; use function interface_exists; use function is_dir; -use function method_exists; use function sprintf; use function sys_get_temp_dir; use function uniqid; use const DIRECTORY_SEPARATOR; -use const PHP_VERSION_ID; /** @psalm-import-type Params from DriverManager */ abstract class AbstractDoctrineExtensionTest extends TestCase @@ -441,16 +438,13 @@ public function testDependencyInjectionImportsOverrideDefaults(): void $this->assertDICDefinitionMethodCallOnce($configDefinition, 'setMetadataCache', [new Reference('doctrine.orm.default_metadata_cache')]); } + /** @requires PHP 8 */ public function testSingleEntityManagerMultipleMappingBundleDefinitions(): void { if (! interface_exists(EntityManagerInterface::class)) { self::markTestSkipped('This test requires ORM'); } - if (PHP_VERSION_ID < 80000 || Kernel::VERSION_ID < 50400) { - self::markTestSkipped('This test requires PHP 8 and Symfony 5.4+'); - } - $container = $this->loadContainer('orm_single_em_bundle_mappings', ['YamlBundle', 'AnnotationsBundle', 'XmlBundle', 'AttributesBundle']); $definition = $container->getDefinition('doctrine.orm.default_metadata_driver'); @@ -494,16 +488,13 @@ public function testSingleEntityManagerMultipleMappingBundleDefinitions(): void ]); } + /** @requires PHP 8 */ public function testMultipleEntityManagersMappingBundleDefinitions(): void { if (! interface_exists(EntityManagerInterface::class)) { self::markTestSkipped('This test requires ORM'); } - if (PHP_VERSION_ID < 80000 || Kernel::VERSION_ID < 50400) { - self::markTestSkipped('This test requires PHP 8 and Symfony 5.4+'); - } - $container = $this->loadContainer('orm_multiple_em_bundle_mappings', ['YamlBundle', 'AnnotationsBundle', 'XmlBundle', 'AttributesBundle']); $this->assertEquals(['em1' => 'doctrine.orm.em1_entity_manager', 'em2' => 'doctrine.orm.em2_entity_manager'], $container->getParameter('doctrine.entity_managers'), 'Set of the existing EntityManagers names is incorrect.'); @@ -511,7 +502,7 @@ public function testMultipleEntityManagersMappingBundleDefinitions(): void $def1 = $container->getDefinition('doctrine.orm.em1_metadata_driver'); $def2 = $container->getDefinition('doctrine.orm.em2_metadata_driver'); - $def1Id = sprintf('doctrine.orm.em1_%s_metadata_driver', PHP_VERSION_ID >= 80000 && Kernel::VERSION_ID >= 50400 ? 'attribute' : 'annotation'); + $def1Id = sprintf('doctrine.orm.em1_%s_metadata_driver', 'attribute'); $this->assertDICDefinitionMethodCallAt(0, $def1, 'addDriver', [ new Reference($def1Id), @@ -1300,11 +1291,7 @@ public function testAbstractEntityListener(): void $this->loadFromFile($container, 'orm_entity_listener_abstract'); $this->expectException(InvalidArgumentException::class); - if (method_exists($this, 'expectExceptionMessageMatches')) { - $this->expectExceptionMessageMatches('/The service ".*" must not be abstract\./'); - } elseif (method_exists($this, 'expectExceptionMessageRegExp')) { - $this->expectExceptionMessageRegExp('/The service ".*" must not be abstract\./'); - } + $this->expectExceptionMessageMatches('/The service ".*" must not be abstract\./'); $this->compileContainer($container); } diff --git a/Tests/DependencyInjection/Compiler/MiddlewarePassTest.php b/Tests/DependencyInjection/Compiler/MiddlewarePassTest.php index 331b68f69..ad5480aeb 100644 --- a/Tests/DependencyInjection/Compiler/MiddlewarePassTest.php +++ b/Tests/DependencyInjection/Compiler/MiddlewarePassTest.php @@ -14,7 +14,6 @@ use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; -use function method_exists; use function sprintf; use const PHP_VERSION_ID; @@ -106,16 +105,10 @@ public function provideAddMiddlewareWithAttributeForAutoconfiguration(): array * @param class-string $className * * @dataProvider provideAddMiddlewareWithAttributeForAutoconfiguration + * @requires PHP 8 */ public function testAddMiddlewareWithAttributeForAutoconfiguration(string $className, bool $registeredOnConn1): void { - if (PHP_VERSION_ID < 80000 || ! method_exists(ContainerBuilder::class, 'registerAttributeForAutoconfiguration')) { - $this->markTestSkipped(sprintf( - 'Testing attribute for autoconfiguration requires PHP 8 and %s::registerAttributeForAutoconfiguration', - ContainerBuilder::class - )); - } - $container = $this->createContainer(static function (ContainerBuilder $container) use ($className) { $container ->register('middleware', $className) diff --git a/Tests/DependencyInjection/DoctrineExtensionTest.php b/Tests/DependencyInjection/DoctrineExtensionTest.php index d904ff449..7c2ca02ef 100644 --- a/Tests/DependencyInjection/DoctrineExtensionTest.php +++ b/Tests/DependencyInjection/DoctrineExtensionTest.php @@ -41,7 +41,6 @@ use ReflectionMethod; use Symfony\Bridge\Doctrine\Attribute\MapEntity; use Symfony\Bridge\Doctrine\Messenger\DoctrineClearEntityManagerWorkerSubscriber; -use Symfony\Bridge\Doctrine\Middleware\Debug\Middleware as SfDebugMiddleware; use Symfony\Component\Cache\Adapter\ArrayAdapter; use Symfony\Component\Cache\Adapter\PhpArrayAdapter; use Symfony\Component\DependencyInjection\ChildDefinition; @@ -50,7 +49,6 @@ use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Messenger\MessageBusInterface; use function array_merge; @@ -59,7 +57,6 @@ use function in_array; use function interface_exists; use function is_dir; -use function method_exists; use function sprintf; use function sys_get_temp_dir; @@ -780,7 +777,7 @@ public function testAnnotationsBundleMappingDetection(): void $definition = $container->getDefinition('doctrine.orm.default_metadata_driver'); $this->assertDICDefinitionMethodCallOnce($definition, 'addDriver', [ - new Reference(sprintf('doctrine.orm.default_%s_metadata_driver', PHP_VERSION_ID >= 80000 && Kernel::VERSION_ID >= 50400 ? 'attribute' : 'annotation')), + new Reference(sprintf('doctrine.orm.default_%s_metadata_driver', PHP_VERSION_ID >= 80000 ? 'attribute' : 'annotation')), 'Fixtures\Bundles\AnnotationsBundle\Entity', ]); } @@ -858,7 +855,7 @@ public function testOrmMergeConfigs(): void $definition = $container->getDefinition('doctrine.orm.default_metadata_driver'); $this->assertDICDefinitionMethodCallAt(0, $definition, 'addDriver', [ - new Reference(sprintf('doctrine.orm.default_%s_metadata_driver', PHP_VERSION_ID >= 80000 && Kernel::VERSION_ID >= 50400 ? 'attribute' : 'annotation')), + new Reference(sprintf('doctrine.orm.default_%s_metadata_driver', PHP_VERSION_ID >= 80000 ? 'attribute' : 'annotation')), 'Fixtures\Bundles\AnnotationsBundle\Entity', ]); $this->assertDICDefinitionMethodCallAt(1, $definition, 'addDriver', [ @@ -909,7 +906,7 @@ public function testAnnotationsBundleMappingDetectionWithVendorNamespace(): void $calls = $container->getDefinition('doctrine.orm.default_metadata_driver')->getMethodCalls(); $this->assertEquals( - sprintf('doctrine.orm.default_%s_metadata_driver', PHP_VERSION_ID >= 80000 && Kernel::VERSION_ID >= 50400 ? 'attribute' : 'annotation'), + sprintf('doctrine.orm.default_%s_metadata_driver', PHP_VERSION_ID >= 80000 ? 'attribute' : 'annotation'), (string) $calls[0][1][0] ); $this->assertEquals('Fixtures\Bundles\Vendor\AnnotationsBundle\Entity', $calls[0][1][1]); @@ -1086,10 +1083,6 @@ public static function cacheConfigurationProvider(): array /** @requires PHP 8 */ public function testAsEntityListenerAttribute() { - if (! method_exists(ContainerBuilder::class, 'getAutoconfiguredAttributes')) { - $this->markTestSkipped('symfony/dependency-injection 5.3.0 needed'); - } - $container = $this->getContainer(); $extension = new DoctrineExtension(); @@ -1105,7 +1098,8 @@ public function testAsEntityListenerAttribute() $reflector = new ReflectionClass(Php8EntityListener::class); $definition = new ChildDefinition(''); - $attribute = $reflector->getAttributes(AsEntityListener::class)[0]->newInstance(); + /** @psalm-suppress UndefinedMethod */ + $attribute = $reflector->getAttributes(AsEntityListener::class)[0]->newInstance(); $attributes[AsEntityListener::class]($definition, $attribute); @@ -1122,10 +1116,6 @@ public function testAsEntityListenerAttribute() /** @requires PHP 8 */ public function testAsEventListenerAttribute() { - if (! method_exists(ContainerBuilder::class, 'getAutoconfiguredAttributes')) { - $this->markTestSkipped('symfony/dependency-injection 5.3.0 needed'); - } - $container = $this->getContainer(); $extension = new DoctrineExtension(); @@ -1141,7 +1131,8 @@ public function testAsEventListenerAttribute() $reflector = new ReflectionClass(Php8EventListener::class); $definition = new ChildDefinition(''); - $attribute = $reflector->getAttributes(AsEventListener::class)[0]->newInstance(); + /** @psalm-suppress UndefinedMethod */ + $attribute = $reflector->getAttributes(AsEventListener::class)[0]->newInstance(); $attributes[AsEventListener::class]($definition, $attribute); @@ -1153,95 +1144,8 @@ public function testAsEventListenerAttribute() $this->assertSame([$expected], $definition->getTag('doctrine.event_listener')); } - public function testRegistrationsWithMiddlewaresButWithoutSfDebugMiddleware(): void - { - /** @psalm-suppress UndefinedClass */ - if (class_exists(SfDebugMiddleware::class)) { - $this->markTestSkipped(sprintf('%s needs %s to not exist', __METHOD__, SfDebugMiddleware::class)); - } - - $container = $this->getContainer(); - $extension = new DoctrineExtension(); - - $config = BundleConfigurationBuilder::createBuilderWithBaseValues() - ->addConnection([ - 'connections' => [ - 'conn1' => [ - 'password' => 'foo', - 'logging' => true, - 'profiling' => false, - ], - 'conn2' => [ - 'password' => 'bar', - 'logging' => false, - 'profiling' => true, - 'profiling_collect_backtrace' => false, - ], - 'conn3' => [ - 'password' => 'bar', - 'logging' => false, - 'profiling' => true, - 'profiling_collect_backtrace' => true, - ], - ], - ]) - ->addBaseEntityManager() - ->build(); - - $extension->load([$config], $container); - - $this->assertTrue($container->hasDefinition('doctrine.dbal.logger')); - $loggerDef = $container->getDefinition('doctrine.dbal.logger'); - $this->assertNull($loggerDef->getArgument(0)); - - $methodCalls = array_merge( - $container->getDefinition('doctrine.dbal.conn1_connection.configuration')->getMethodCalls(), - $container->getDefinition('doctrine.dbal.conn2_connection.configuration')->getMethodCalls(), - $container->getDefinition('doctrine.dbal.conn3_connection.configuration')->getMethodCalls() - ); - - foreach ($methodCalls as $methodCall) { - if ($methodCall[0] !== 'setSQLLogger' || ! (($methodCall[1][0] ?? null) instanceof Reference) || (string) $methodCall[1][0] !== 'doctrine.dbal.logger') { - continue; - } - - $this->fail('doctrine.dbal.logger should not be referenced on configurations'); - } - - $this->assertTrue($container->hasDefinition('doctrine.dbal.logging_middleware')); - - $abstractMiddlewareDefTags = $container->getDefinition('doctrine.dbal.logging_middleware')->getTags(); - $loggingMiddlewareTagAttributes = []; - foreach ($abstractMiddlewareDefTags as $tag => $attributes) { - if ($tag !== 'doctrine.middleware') { - continue; - } - - $loggingMiddlewareTagAttributes = $attributes; - } - - $this->assertTrue(in_array(['connection' => 'conn1'], $loggingMiddlewareTagAttributes, true)); - $this->assertFalse(in_array(['connection' => 'conn2'], $loggingMiddlewareTagAttributes, true)); - $this->assertFalse(in_array(['connection' => 'conn3'], $loggingMiddlewareTagAttributes, true)); - - $this->assertFalse($container->hasDefinition('doctrine.dbal.debug_middleware')); - $this->assertFalse($container->hasDefinition('doctrine.debug_data_holder')); - - $this->assertFalse($container->hasDefinition('doctrine.dbal.logger.profiling.conn1')); - $this->assertFalse($container->hasDefinition('doctrine.dbal.logger.backtrace.conn1')); - $this->assertTrue($container->hasDefinition('doctrine.dbal.logger.profiling.conn2')); - $this->assertFalse($container->hasDefinition('doctrine.dbal.logger.backtrace.conn2')); - $this->assertFalse($container->hasDefinition('doctrine.dbal.logger.profiling.conn3')); - $this->assertTrue($container->hasDefinition('doctrine.dbal.logger.backtrace.conn3')); - } - public function testRegistrationsWithMiddlewaresAndSfDebugMiddleware(): void { - /** @psalm-suppress UndefinedClass */ - if (! class_exists(SfDebugMiddleware::class)) { - $this->markTestSkipped(sprintf('%s needs %s to exist', __METHOD__, SfDebugMiddleware::class)); - } - $container = $this->getContainer(); $extension = new DoctrineExtension(); @@ -1335,26 +1239,8 @@ public function testRegistrationsWithMiddlewaresAndSfDebugMiddleware(): void $this->assertSame(['conn3'], $arguments[0]); } - /** @return array */ - public function provideDefinitionsToLogAndProfile(): array + public function testDefinitionsToLogAndProfile(): void { - return [ - 'with debug middleware' => [true, null, true], - 'without debug middleware' => [false, false, true], - ]; - } - - /** @dataProvider provideDefinitionsToLogAndProfile */ - public function testDefinitionsToLogAndProfile( - bool $withDebugMiddleware, - ?bool $loggerInjected, - bool $loggingMiddlewareRegistered - ): void { - /** @psalm-suppress UndefinedClass */ - if ($withDebugMiddleware !== class_exists(SfDebugMiddleware::class, false)) { - $this->markTestSkipped(sprintf('%s needs %s to not exist', __METHOD__, SfDebugMiddleware::class)); - } - $container = $this->getContainer(); $extension = new DoctrineExtension(); @@ -1378,12 +1264,7 @@ public function testDefinitionsToLogAndProfile( $extension->load([$config], $container); - if ($loggerInjected !== null) { - $loggerDef = $container->getDefinition('doctrine.dbal.logger'); - $this->assertSame($loggerInjected, $loggerDef->getArgument(0) !== null); - } - - $this->assertSame($loggingMiddlewareRegistered, $container->hasDefinition('doctrine.dbal.logging_middleware')); + $this->assertTrue($container->hasDefinition('doctrine.dbal.logging_middleware')); $abstractMiddlewareDefTags = $container->getDefinition('doctrine.dbal.logging_middleware')->getTags(); $loggingMiddlewareTagAttributes = []; @@ -1398,15 +1279,6 @@ public function testDefinitionsToLogAndProfile( $this->assertTrue(in_array(['connection' => 'conn1'], $loggingMiddlewareTagAttributes, true), 'Tag with connection conn1 not found for doctrine.dbal.logging_middleware'); $this->assertFalse(in_array(['connection' => 'conn2'], $loggingMiddlewareTagAttributes, true), 'Tag with connection conn2 found for doctrine.dbal.logging_middleware'); - if (! $withDebugMiddleware) { - $this->assertFalse($container->hasDefinition('doctrine.dbal.debug_middleware'), 'doctrine.dbal.debug_middleware not removed'); - $this->assertFalse($container->hasDefinition('doctrine.debug_data_holder'), 'doctrine.debug_data_holder not removed'); - $this->assertFalse($container->hasDefinition('doctrine.dbal.logger.profiling.conn1')); - $this->assertTrue($container->hasDefinition('doctrine.dbal.logger.profiling.conn2')); - - return; - } - $this->assertFalse($container->hasDefinition('doctrine.dbal.logger.profiling.conn1')); $this->assertFalse($container->hasDefinition('doctrine.dbal.logger.profiling.conn2')); diff --git a/composer.json b/composer.json index 00e509191..f9de7eea5 100644 --- a/composer.json +++ b/composer.json @@ -35,13 +35,13 @@ "doctrine/dbal": "^3.4.0", "doctrine/persistence": "^2.2 || ^3", "doctrine/sql-formatter": "^1.0.1", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "symfony/config": "^4.4.3 || ^5.4 || ^6.0", - "symfony/console": "^4.4 || ^5.4 || ^6.0", - "symfony/dependency-injection": "^4.4.18 || ^5.4 || ^6.0", + "symfony/cache": "^5.4 || ^6.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/console": "^5.4 || ^6.0", + "symfony/dependency-injection": "^5.4 || ^6.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^4.4.22 || ^5.4 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0", + "symfony/doctrine-bridge": "^5.4.7 || ^6.0.7", + "symfony/framework-bundle": "^5.4 || ^6.0", "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" }, "require-dev": { @@ -53,13 +53,13 @@ "psalm/plugin-symfony": "^3", "psr/log": "^1.1.4 || ^2.0 || ^3.0", "symfony/phpunit-bridge": "^6.1", - "symfony/property-info": "^4.4 || ^5.4 || ^6.0", - "symfony/proxy-manager-bridge": "^4.4 || ^5.4 || ^6.0", - "symfony/security-bundle": "^4.4 || ^5.4 || ^6.0", - "symfony/twig-bridge": "^4.4 || ^5.4 || ^6.0", - "symfony/validator": "^4.4 || ^5.4 || ^6.0", - "symfony/web-profiler-bundle": "^4.4 || ^5.4 || ^6.0", - "symfony/yaml": "^4.4 || ^5.4 || ^6.0", + "symfony/property-info": "^5.4 || ^6.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0", + "symfony/security-bundle": "^5.4 || ^6.0", + "symfony/twig-bridge": "^5.4 || ^6.0", + "symfony/validator": "^5.4 || ^6.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0", + "symfony/yaml": "^5.4 || ^6.0", "twig/twig": "^1.34 || ^2.12 || ^3.0", "vimeo/psalm": "^4.7" },