diff --git a/composer.json b/composer.json index 1c4752519..f163d7f84 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ "require-dev": { "doctrine/coding-standard": "^13", "doctrine/deprecations": "^1.0", - "doctrine/orm": "^3.1", + "doctrine/orm": "^3.4.4", "friendsofphp/proxy-manager-lts": "^1.0", "phpstan/phpstan": "2.1.1", "phpstan/phpstan-phpunit": "2.0.3", diff --git a/config/orm.php b/config/orm.php index 7b03fec3f..ffdd96bf4 100644 --- a/config/orm.php +++ b/config/orm.php @@ -42,7 +42,6 @@ use Doctrine\Persistence\Mapping\Driver\PHPDriver; use Doctrine\Persistence\Mapping\Driver\StaticPHPDriver; use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver; -use Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer; use Symfony\Bridge\Doctrine\Form\DoctrineOrmTypeGuesser; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\SchemaListener\DoctrineDbalCacheAdapterSchemaListener; @@ -70,9 +69,6 @@ ->set('doctrine.orm.metadata.staticphp.class', StaticPHPDriver::class) ->set('doctrine.orm.metadata.attribute.class', AttributeDriver::class) - // cache warmer - ->set('doctrine.orm.proxy_cache_warmer.class', ProxyCacheWarmer::class) - // form field factory guesser ->set('form.type_guesser.doctrine.class', DoctrineOrmTypeGuesser::class) @@ -114,12 +110,6 @@ ->alias(EntityManagerInterface::class, 'doctrine.orm.entity_manager') - ->set('doctrine.orm.proxy_cache_warmer', param('doctrine.orm.proxy_cache_warmer.class')) - ->tag('kernel.cache_warmer') - ->args([ - service('doctrine'), - ]) - ->set('form.type_guesser.doctrine', param('form.type_guesser.doctrine.class')) ->tag('form.type_guesser') ->args([ diff --git a/config/schema/doctrine-1.0.xsd b/config/schema/doctrine-1.0.xsd index 12ba45571..b5a882cca 100644 --- a/config/schema/doctrine-1.0.xsd +++ b/config/schema/doctrine-1.0.xsd @@ -146,9 +146,6 @@ - - - diff --git a/docs/en/configuration.rst b/docs/en/configuration.rst index e8e5c0114..6d821c60e 100644 --- a/docs/en/configuration.rst +++ b/docs/en/configuration.rst @@ -213,12 +213,9 @@ Configuration Reference orm: default_entity_manager: ~ # The first defined is used if not set - # Auto generate mode possible values are: "NEVER", "ALWAYS", "FILE_NOT_EXISTS", "EVAL", "FILE_NOT_EXISTS_OR_CHANGED" - auto_generate_proxy_classes: false - proxy_dir: "%kernel.cache_dir%/doctrine/orm/Proxies" - proxy_namespace: Proxies - # Enables the new native implementation of PHP lazy objects instead of generated proxies - enable_native_lazy_objects: false + # No-op, will be deprecated and removed in the future + enable_native_lazy_objects: true + identity_generation_preferences: Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity @@ -494,13 +491,7 @@ Configuration Reference - - + - - - - src diff --git a/src/CacheWarmer/DoctrineMetadataCacheWarmer.php b/src/CacheWarmer/DoctrineMetadataCacheWarmer.php index 7bb9afe97..f16de178a 100644 --- a/src/CacheWarmer/DoctrineMetadataCacheWarmer.php +++ b/src/CacheWarmer/DoctrineMetadataCacheWarmer.php @@ -19,12 +19,9 @@ public function __construct( parent::__construct($phpArrayFile); } - /** - * It must not be optional because it should be called before ProxyCacheWarmer which is not optional. - */ public function isOptional(): bool { - return false; + return true; } protected function doWarmUp(string $cacheDir, ArrayAdapter $arrayAdapter, string|null $buildDir = null): bool diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index ce31e477d..5d5b2b0ac 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -6,9 +6,7 @@ use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\ClassMetadataFactory; -use Doctrine\ORM\Proxy\ProxyFactory; use InvalidArgumentException; -use ReflectionClass; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; @@ -27,16 +25,11 @@ use function implode; use function in_array; use function is_array; -use function is_bool; -use function is_int; use function is_string; use function key; use function reset; use function sprintf; -use function strlen; -use function strpos; use function strtoupper; -use function substr; use function trigger_deprecation; /** @@ -417,10 +410,7 @@ private function addOrmSection(ArrayNodeDefinition $node): void // Key that should not be rewritten to the entity-manager config $excludedKeys = [ 'default_entity_manager' => true, - 'auto_generate_proxy_classes' => true, 'enable_native_lazy_objects' => true, - 'proxy_dir' => true, - 'proxy_namespace' => true, 'resolve_target_entities' => true, 'resolve_target_entity' => true, 'controller_resolver' => true, @@ -464,46 +454,9 @@ private function addOrmSection(ArrayNodeDefinition $node): void ->end() ->children() ->scalarNode('default_entity_manager')->end() - ->scalarNode('auto_generate_proxy_classes')->defaultValue(false) - ->info('Auto generate mode possible values are: "NEVER", "ALWAYS", "FILE_NOT_EXISTS", "EVAL", "FILE_NOT_EXISTS_OR_CHANGED", this option is ignored when the "enable_native_lazy_objects" option is true') - ->validate() - ->ifTrue(function ($v) { - $generationModes = $this->getAutoGenerateModes(); - - if (is_int($v) && in_array($v, $generationModes['values']/*array(0, 1, 2, 3)*/)) { - return false; - } - - if (is_bool($v)) { - return false; - } - - if (is_string($v)) { - if (in_array(strtoupper($v), $generationModes['names']/*array('NEVER', 'ALWAYS', 'FILE_NOT_EXISTS', 'EVAL', 'FILE_NOT_EXISTS_OR_CHANGED')*/)) { - return false; - } - } - - return true; - }) - ->thenInvalid('Invalid auto generate mode value %s') - ->end() - ->validate() - ->ifString() - ->then(static fn (string $v) => constant('Doctrine\ORM\Proxy\ProxyFactory::AUTOGENERATE_' . strtoupper($v))) - ->end() - ->end() ->booleanNode('enable_native_lazy_objects') - ->defaultFalse() - ->info('Enables the new native implementation of PHP lazy objects instead of generated proxies') - ->end() - ->scalarNode('proxy_dir') - ->defaultValue('%kernel.build_dir%/doctrine/orm/Proxies') - ->info('Configures the path where generated proxy classes are saved when using non-native lazy objects, this option is ignored when the "enable_native_lazy_objects" option is true') - ->end() - ->scalarNode('proxy_namespace') - ->defaultValue('Proxies') - ->info('Defines the root namespace for generated proxy classes when using non-native lazy objects, this option is ignored when the "enable_native_lazy_objects" option is true') + ->defaultTrue() + ->info('no-op, will be deprecated and removed in the future') ->end() ->arrayNode('controller_resolver') ->canBeDisabled() @@ -833,33 +786,4 @@ private function getOrmCacheDriverNode(string $name): ArrayNodeDefinition return $node; } - - /** - * Find proxy auto generate modes for their names and int values - * - * @return array{names: list, values: list} - */ - private function getAutoGenerateModes(): array - { - $constPrefix = 'AUTOGENERATE_'; - $prefixLen = strlen($constPrefix); - $refClass = new ReflectionClass(ProxyFactory::class); - $constsArray = $refClass->getConstants(); - $namesArray = []; - $valuesArray = []; - - foreach ($constsArray as $key => $value) { - if (strpos($key, $constPrefix) !== 0) { - continue; - } - - $namesArray[] = substr($key, $prefixLen); - $valuesArray[] = (int) $value; - } - - return [ - 'names' => $namesArray, - 'values' => $valuesArray, - ]; - } } diff --git a/src/DependencyInjection/DoctrineExtension.php b/src/DependencyInjection/DoctrineExtension.php index 6c40a039c..0917c1582 100644 --- a/src/DependencyInjection/DoctrineExtension.php +++ b/src/DependencyInjection/DoctrineExtension.php @@ -16,7 +16,6 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Connections\PrimaryReadReplicaConnection; use Doctrine\DBAL\Driver\Middleware as MiddlewareInterface; -use Doctrine\ORM\Configuration as ORMConfiguration; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Events; use Doctrine\ORM\Id\AbstractIdGenerator; @@ -26,9 +25,7 @@ use Doctrine\ORM\Mapping\Driver\StaticPHPDriver as LegacyStaticPHPDriver; use Doctrine\ORM\Mapping\Embeddable; use Doctrine\ORM\Mapping\Entity; -use Doctrine\ORM\Mapping\LegacyReflectionFields; use Doctrine\ORM\Mapping\MappedSuperclass; -use Doctrine\ORM\ORMSetup; use Doctrine\ORM\Proxy\Autoloader; use Doctrine\ORM\UnitOfWork; use Doctrine\Persistence\Mapping\Driver\MappingDriverChain; @@ -59,21 +56,16 @@ use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface; use Symfony\Component\Validator\Mapping\Loader\LoaderInterface; -use Symfony\Component\VarExporter\ProxyHelper; use function array_intersect_key; use function array_keys; use function array_merge; -use function assert; use function class_exists; use function interface_exists; -use function is_bool; use function is_dir; -use function method_exists; use function reset; use function sprintf; use function str_replace; -use function trigger_deprecation; /** * DoctrineExtension is an extension for the Doctrine DBAL and ORM library. @@ -514,32 +506,6 @@ protected function ormLoad(array $config, ContainerBuilder $container): void $container->setParameter('doctrine.default_entity_manager', $config['default_entity_manager']); - if (! class_exists(ProxyHelper::class)) { - throw new LogicException( - 'Lazy ghost objects cannot be enabled because the "symfony/var-exporter" library' - . ' is not installed. Please run "composer require symfony/var-exporter".', - ); - } - - if ($config['enable_native_lazy_objects'] ?? false) { - /** @phpstan-ignore function.alreadyNarrowedType */ - if (! method_exists(ORMConfiguration::class, 'enableNativeLazyObjects')) { - throw new LogicException( - 'Native lazy objects are not supported with your installed version of the ORM. Please upgrade to "doctrine/orm >= 3.4".', - ); - } - - $container->removeDefinition('doctrine.orm.proxy_cache_warmer'); - } else { - // Only emit the deprecation notice for ORM 3 users - trigger_deprecation('doctrine/doctrine-bundle', '2.16', 'Not setting "doctrine.orm.enable_native_lazy_objects" to true is deprecated.'); - } - - $options = ['auto_generate_proxy_classes', 'enable_native_lazy_objects', 'proxy_dir', 'proxy_namespace']; - foreach ($options as $key) { - $container->setParameter('doctrine.orm.' . $key, $config[$key]); - } - $container->setAlias('doctrine.orm.entity_manager', $defaultEntityManagerDefinitionId = sprintf('doctrine.orm.%s_entity_manager', $config['default_entity_manager'])); $container->getAlias('doctrine.orm.entity_manager')->setPublic(true); @@ -642,13 +608,11 @@ protected function loadOrmEntityManager(array $entityManager, ContainerBuilder $ } $methods = [ + 'enableNativeLazyObjects' => true, 'setMetadataCache' => new Reference(sprintf('doctrine.orm.%s_metadata_cache', $entityManager['name'])), 'setQueryCache' => new Reference(sprintf('doctrine.orm.%s_query_cache', $entityManager['name'])), 'setResultCache' => new Reference(sprintf('doctrine.orm.%s_result_cache', $entityManager['name'])), 'setMetadataDriverImpl' => new Reference('doctrine.orm.' . $entityManager['name'] . '_metadata_driver'), - 'setProxyDir' => '%doctrine.orm.proxy_dir%', - 'setProxyNamespace' => '%doctrine.orm.proxy_namespace%', - 'setAutoGenerateProxyClasses' => '%doctrine.orm.auto_generate_proxy_classes%', 'setSchemaIgnoreClasses' => $entityManager['schema_ignore_classes'], 'setClassMetadataFactoryName' => $entityManager['class_metadata_factory_name'], 'setDefaultRepositoryClassName' => $entityManager['default_repository_class'], @@ -659,24 +623,6 @@ protected function loadOrmEntityManager(array $entityManager, ContainerBuilder $ 'setIdentityGenerationPreferences' => $entityManager['identity_generation_preferences'], ]; - if (class_exists(LegacyReflectionFields::class)) { - $enableNativeLazyObjects = $container->getParameter('doctrine.orm.enable_native_lazy_objects'); - - assert(is_bool($enableNativeLazyObjects)); - - $methods['enableNativeLazyObjects'] = $enableNativeLazyObjects; - - // Do not set deprecated proxy configurations when native lazy objects are enabled with `doctrine/orm:^3.5` - /** @phpstan-ignore function.alreadyNarrowedType */ - if ($enableNativeLazyObjects && method_exists(ORMSetup::class, 'createAttributeMetadataConfig')) { - unset( - $methods['setProxyDir'], - $methods['setProxyNamespace'], - $methods['setAutoGenerateProxyClasses'], - ); - } - } - if (isset($entityManager['fetch_mode_subselect_batch_size'])) { $methods['setEagerFetchBatchSize'] = $entityManager['fetch_mode_subselect_batch_size']; } @@ -1058,7 +1004,7 @@ private function createMetadataCache(string $objectManagerName, ContainerBuilder $container->register($cacheWarmerServiceId, DoctrineMetadataCacheWarmer::class) ->setArguments([new Reference(sprintf('doctrine.orm.%s_entity_manager', $objectManagerName)), $phpArrayFile]) - ->addTag('kernel.cache_warmer', ['priority' => 1000]); // priority should be higher than ProxyCacheWarmer + ->addTag('kernel.cache_warmer', ['priority' => 1000]); $cache = new Definition(PhpArrayAdapter::class, [$phpArrayFile, $cache]); } diff --git a/src/DoctrineBundle.php b/src/DoctrineBundle.php index b7e3d1d6c..fe771a51d 100644 --- a/src/DoctrineBundle.php +++ b/src/DoctrineBundle.php @@ -2,7 +2,6 @@ namespace Doctrine\Bundle\DoctrineBundle; -use Closure; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\CacheSchemaSubscriberPass; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DbalSchemaFilterPass; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\EntityListenerPass; @@ -11,9 +10,6 @@ use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\RemoveLoggingMiddlewarePass; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\RemoveProfilerControllerPass; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\ServiceRepositoryCompilerPass; -use Doctrine\ORM\EntityManagerInterface; -use Doctrine\ORM\Proxy\Autoloader; -use Doctrine\ORM\Proxy\DefaultProxyClassNameResolver; use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\DoctrineValidationPass; use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterDatePointTypePass; use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterEventListenersAndSubscribersPass; @@ -26,17 +22,12 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; -use function assert; use function class_exists; -use function clearstatcache; use function dirname; -use function spl_autoload_unregister; /** @final since 2.9 */ class DoctrineBundle extends Bundle { - private Closure|null $autoloader = null; - public function build(ContainerBuilder $container): void { parent::build($container); @@ -80,65 +71,8 @@ public function process(ContainerBuilder $container): void $container->addCompilerPass(new RegisterDatePointTypePass()); } - public function boot(): void - { - // Register an autoloader for proxies when native lazy objects are not in use - // to avoid issues when unserializing them when the ORM is used. - if ($this->container->hasParameter('doctrine.orm.enable_native_lazy_objects') && $this->container->getParameter('doctrine.orm.enable_native_lazy_objects')) { - return; - } - - if (! $this->container->hasParameter('doctrine.orm.proxy_namespace')) { - return; - } - - $namespace = (string) $this->container->getParameter('doctrine.orm.proxy_namespace'); - $dir = (string) $this->container->getParameter('doctrine.orm.proxy_dir'); - $proxyGenerator = null; - - if ($this->container->getParameter('doctrine.orm.auto_generate_proxy_classes')) { - // See https://github.com/symfony/symfony/pull/3419 for usage of references - /** @psalm-suppress UnsupportedPropertyReferenceUsage */ - $container = &$this->container; - - $proxyGenerator = static function ($proxyDir, $proxyNamespace, $class) use (&$container): void { - $originalClassName = (new DefaultProxyClassNameResolver())->resolveClassName($class); - $registry = $container->get('doctrine'); - assert($registry instanceof Registry); - - foreach ($registry->getManagers() as $em) { - assert($em instanceof EntityManagerInterface); - if (! $em->getConfiguration()->getAutoGenerateProxyClasses()) { - continue; - } - - $metadataFactory = $em->getMetadataFactory(); - - if ($metadataFactory->isTransient($originalClassName)) { - continue; - } - - $classMetadata = $metadataFactory->getMetadataFor($originalClassName); - - $em->getProxyFactory()->generateProxyClasses([$classMetadata]); - - clearstatcache(true, Autoloader::resolveFile($proxyDir, $proxyNamespace, $class)); - - break; - } - }; - } - - $this->autoloader = Autoloader::register($dir, $namespace, $proxyGenerator); - } - public function shutdown(): void { - if ($this->autoloader !== null) { - spl_autoload_unregister($this->autoloader); - $this->autoloader = null; - } - // Clear all entity managers to clear references to entities for GC if ($this->container->hasParameter('doctrine.entity_managers')) { foreach ($this->container->getParameter('doctrine.entity_managers') as $id) { diff --git a/src/Registry.php b/src/Registry.php index 241bf43fb..cab26aa12 100644 --- a/src/Registry.php +++ b/src/Registry.php @@ -5,16 +5,13 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\ORMException; use Doctrine\Persistence\Proxy; -use ProxyManager\Proxy\LazyLoadingInterface; use ReflectionClass; use Symfony\Bridge\Doctrine\ManagerRegistry; use Symfony\Component\DependencyInjection\Container; -use Symfony\Component\VarExporter\LazyObjectInterface; use Symfony\Contracts\Service\ResetInterface; use function array_keys; use function assert; -use function method_exists; /** * References all Doctrine connections and entity managers in a given Container. @@ -81,27 +78,15 @@ private function resetOrClearManager(string $managerName, string $serviceId): vo assert($manager instanceof EntityManagerInterface); - // Determine if the version of symfony/dependency-injection is >= 7.3 - /** @phpstan-ignore function.alreadyNarrowedType */ - $sfNativeLazyObjects = method_exists('Symfony\Component\DependencyInjection\ContainerBuilder', 'findTaggedResourceIds'); - - if (! $sfNativeLazyObjects) { - if ((! $manager instanceof LazyLoadingInterface && ! $manager instanceof LazyObjectInterface) || $manager->isOpen()) { - $manager->clear(); - - return; - } - } else { - $r = new ReflectionClass($manager); - if ($r->isUninitializedLazyObject($manager)) { - return; - } + $r = new ReflectionClass($manager); + if ($r->isUninitializedLazyObject($manager)) { + return; + } - if ($manager->isOpen()) { - $manager->clear(); + if ($manager->isOpen()) { + $manager->clear(); - return; - } + return; } $this->resetManager($managerName); diff --git a/tests/ContainerTest.php b/tests/ContainerTest.php index 579d536a5..b6698b884 100644 --- a/tests/ContainerTest.php +++ b/tests/ContainerTest.php @@ -16,7 +16,6 @@ use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\Mapping\Driver\MappingDriverChain; use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver; -use Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer; use Symfony\Bridge\Doctrine\DataCollector\DoctrineDataCollector; use Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator; @@ -60,11 +59,6 @@ public function testContainer(): void $this->assertInstanceOf(InfoCommand::class, $container->get('doctrine.mapping_info_command')); $this->assertInstanceOf(MappingDescribeCommand::class, $container->get('doctrine.mapping_describe_command')); $this->assertInstanceOf(UpdateCommand::class, $container->get('doctrine.schema_update_command')); - - if (! $container->getParameter('doctrine.orm.enable_native_lazy_objects')) { - $this->assertInstanceOf(ProxyCacheWarmer::class, $container->get('doctrine.orm.proxy_cache_warmer')); - } - $this->assertTrue(Type::hasType('test')); $this->assertFalse($container->has('doctrine.dbal.default_connection.events.mysqlsessioninit')); diff --git a/tests/DependencyInjection/AbstractDoctrineExtensionTestCase.php b/tests/DependencyInjection/AbstractDoctrineExtensionTestCase.php index dc97795d9..9c149963b 100644 --- a/tests/DependencyInjection/AbstractDoctrineExtensionTestCase.php +++ b/tests/DependencyInjection/AbstractDoctrineExtensionTestCase.php @@ -14,7 +14,6 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver; -use Doctrine\ORM\Mapping\LegacyReflectionFields; use Generator; use InvalidArgumentException; use PDO; @@ -37,7 +36,6 @@ use function array_keys; use function array_values; use function assert; -use function class_exists; use function end; use function interface_exists; use function is_dir; @@ -478,7 +476,6 @@ public function testDependencyInjectionImportsOverrideDefaults(): void $container = $this->loadContainer('orm_imports'); $configDefinition = $container->getDefinition('doctrine.orm.default_configuration'); - $this->assertDICDefinitionMethodCallOnce($configDefinition, 'setAutoGenerateProxyClasses', ['%doctrine.orm.auto_generate_proxy_classes%']); $cacheDefinition = $container->getDefinition((string) $container->getAlias('doctrine.orm.default_metadata_cache')); $this->assertEquals(PhpArrayAdapter::class, $cacheDefinition->getClass()); @@ -1302,14 +1299,10 @@ public function testNativeLazyObjectsWithoutConfig(): void self::markTestSkipped('This test requires ORM'); } - if (! class_exists(LegacyReflectionFields::class)) { - self::markTestSkipped('This test requires ORM 3.4+'); - } - $container = $this->loadContainer('orm_filters'); $entityManager = $container->get('doctrine.orm.entity_manager'); - $this->assertFalse($entityManager->getConfiguration()->isNativeLazyObjectsEnabled()); + $this->assertTrue($entityManager->getConfiguration()->isNativeLazyObjectsEnabled()); } public function testNativeLazyObjectsWithConfigTrue(): void @@ -1318,10 +1311,6 @@ public function testNativeLazyObjectsWithConfigTrue(): void self::markTestSkipped('This test requires ORM'); } - if (! class_exists(LegacyReflectionFields::class)) { - self::markTestSkipped('This test requires ORM 3.4+'); - } - $container = $this->loadContainer('orm_native_lazy_objects_enable'); $entityManager = $container->get('doctrine.orm.entity_manager'); @@ -1334,14 +1323,13 @@ public function testNativeLazyObjectsWithConfigFalse(): void self::markTestSkipped('This test requires ORM'); } - if (! class_exists(LegacyReflectionFields::class)) { - self::markTestSkipped('This test requires ORM 3.4+'); - } - $container = $this->loadContainer('orm_native_lazy_objects_disable'); $entityManager = $container->get('doctrine.orm.entity_manager'); - $this->assertFalse($entityManager->getConfiguration()->isNativeLazyObjectsEnabled()); + $this->assertTrue( + $entityManager->getConfiguration()->isNativeLazyObjectsEnabled(), + 'The configuration node should be silently ignored, and will be deprecated in the future.', + ); } /** @param list $bundles */ diff --git a/tests/DependencyInjection/Compiler/IdGeneratorPassTest.php b/tests/DependencyInjection/Compiler/IdGeneratorPassTest.php index aea52a258..9dc2e70dd 100644 --- a/tests/DependencyInjection/Compiler/IdGeneratorPassTest.php +++ b/tests/DependencyInjection/Compiler/IdGeneratorPassTest.php @@ -5,7 +5,6 @@ use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\IdGeneratorPass; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension; use Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\Fixtures\CustomIdGenerator; -use Doctrine\ORM\Configuration; use Doctrine\ORM\EntityManagerInterface; use Fixtures\Bundles\AttributesBundle\AttributesBundle; use Fixtures\Bundles\AttributesBundle\Entity\TestCustomIdGeneratorEntity as AttributeCustomIdGeneratorEntity; @@ -16,7 +15,6 @@ use function assert; use function interface_exists; -use function method_exists; use function sys_get_temp_dir; use function uniqid; @@ -84,11 +82,7 @@ public function testRepositoryServiceWiring(): void 'charset' => 'UTF8', 'schema_manager_factory' => 'doctrine.dbal.default_schema_manager_factory', ], - 'orm' => [ - 'mappings' => $mappings, - /** @phpstan-ignore function.alreadyNarrowedType */ - 'enable_native_lazy_objects' => method_exists(Configuration::class, 'enableNativeLazyObjects'), - ], + 'orm' => ['mappings' => $mappings], ], ], $container); diff --git a/tests/DependencyInjection/DoctrineExtensionTest.php b/tests/DependencyInjection/DoctrineExtensionTest.php index 01078c275..55364c6f3 100644 --- a/tests/DependencyInjection/DoctrineExtensionTest.php +++ b/tests/DependencyInjection/DoctrineExtensionTest.php @@ -400,10 +400,8 @@ public function testDependencyInjectionConfigurationDefaults(): void $extension->load([$config], $container); - $this->assertFalse($container->getParameter('doctrine.orm.auto_generate_proxy_classes')); $this->assertEquals(Configuration::class, $container->getParameter('doctrine.orm.configuration.class')); $this->assertEquals(EntityManager::class, $container->getParameter('doctrine.orm.entity_manager.class')); - $this->assertEquals('Proxies', $container->getParameter('doctrine.orm.proxy_namespace')); $this->assertEquals(MappingDriverChain::class, $container->getParameter('doctrine.orm.metadata.driver_chain.class')); $this->assertEquals(SimplifiedXmlDriver::class, $container->getParameter('doctrine.orm.metadata.xml.class')); @@ -419,8 +417,6 @@ public function testDependencyInjectionConfigurationDefaults(): void $config = BundleConfigurationBuilder::createBuilder() ->addBaseConnection() ->addEntityManager([ - 'proxy_namespace' => 'MyProxies', - 'auto_generate_proxy_classes' => true, 'default_entity_manager' => 'default', 'entity_managers' => [ 'default' => [ @@ -460,14 +456,14 @@ public function testDependencyInjectionConfigurationDefaults(): void $definition = $container->getDefinition('doctrine.orm.default_configuration'); $calls = array_values($definition->getMethodCalls()); $this->assertEquals(['XmlBundle' => 'Fixtures\Bundles\XmlBundle\Entity'], $calls[0][1][0]); - $this->assertEquals('doctrine.orm.default_metadata_cache', (string) $calls[1][1][0]); - $this->assertEquals('doctrine.orm.default_query_cache', (string) $calls[2][1][0]); - $this->assertEquals('doctrine.orm.default_result_cache', (string) $calls[3][1][0]); + $this->assertEquals('doctrine.orm.default_metadata_cache', (string) $calls[2][1][0]); + $this->assertEquals('doctrine.orm.default_query_cache', (string) $calls[3][1][0]); + $this->assertEquals('doctrine.orm.default_result_cache', (string) $calls[4][1][0]); - $this->assertEquals('doctrine.orm.naming_strategy.default', (string) $calls[11][1][0]); - $this->assertEquals('doctrine.orm.quote_strategy.default', (string) $calls[12][1][0]); - $this->assertEquals('doctrine.orm.typed_field_mapper.default', (string) $calls[13][1][0]); - $this->assertEquals('doctrine.orm.default_entity_listener_resolver', (string) $calls[14][1][0]); + $this->assertEquals('doctrine.orm.naming_strategy.default', (string) $calls[9][1][0]); + $this->assertEquals('doctrine.orm.quote_strategy.default', (string) $calls[10][1][0]); + $this->assertEquals('doctrine.orm.typed_field_mapper.default', (string) $calls[11][1][0]); + $this->assertEquals('doctrine.orm.default_entity_listener_resolver', (string) $calls[12][1][0]); $definition = $container->getDefinition('doctrine.orm.default_metadata_cache_warmer'); $this->assertSame(DoctrineMetadataCacheWarmer::class, $definition->getClass()); @@ -513,34 +509,6 @@ public function testUseSavePointsAddMethodCallToAddSavepointsToTheConnection(): $this->assertCount(0, $calls); } - public function testAutoGenerateProxyClasses(): void - { - if (! interface_exists(EntityManagerInterface::class)) { - self::markTestSkipped('This test requires ORM'); - } - - $container = $this->getContainer(); - $extension = new DoctrineExtension(); - - $config = BundleConfigurationBuilder::createBuilder() - ->addBaseConnection() - ->addEntityManager([ - 'proxy_namespace' => 'MyProxies', - 'auto_generate_proxy_classes' => 'eval', - 'default_entity_manager' => 'default', - 'entity_managers' => [ - 'default' => [ - 'mappings' => ['XmlBundle' => []], - ], - ], - ]) - ->build(); - - $extension->load([$config], $container); - - $this->assertEquals(3 /* \Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_EVAL */, $container->getParameter('doctrine.orm.auto_generate_proxy_classes')); - } - public function testSingleEntityManagerWithDefaultConfiguration(): void { if (! interface_exists(EntityManagerInterface::class)) { @@ -793,7 +761,6 @@ public function testOrmMergeConfigs(): void $config1 = BundleConfigurationBuilder::createBuilder() ->addBaseConnection() ->addEntityManager([ - 'auto_generate_proxy_classes' => true, 'default_entity_manager' => 'default', 'entity_managers' => [ 'default' => [ @@ -805,7 +772,6 @@ public function testOrmMergeConfigs(): void $config2 = BundleConfigurationBuilder::createBuilder() ->addBaseConnection() ->addEntityManager([ - 'auto_generate_proxy_classes' => false, 'default_entity_manager' => 'default', 'entity_managers' => [ 'default' => [ @@ -827,18 +793,6 @@ public function testOrmMergeConfigs(): void new Reference('doctrine.orm.default_xml_metadata_driver'), 'Fixtures\Bundles\XmlBundle\Entity', ]); - - $configDef = $container->getDefinition('doctrine.orm.default_configuration'); - $this->assertDICDefinitionMethodCallOnce($configDef, 'setAutoGenerateProxyClasses'); - - $calls = $configDef->getMethodCalls(); - foreach ($calls as $call) { - if ($call[0] === 'setAutoGenerateProxyClasses') { - $this->assertFalse($container->getParameterBag()->resolveValue($call[1][0])); - - break; - } - } } public function testMessengerIntegration(): void diff --git a/tests/DependencyInjection/Fixtures/TestKernel.php b/tests/DependencyInjection/Fixtures/TestKernel.php index a2c4b710d..981283d22 100644 --- a/tests/DependencyInjection/Fixtures/TestKernel.php +++ b/tests/DependencyInjection/Fixtures/TestKernel.php @@ -3,7 +3,6 @@ namespace Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\Fixtures; use Doctrine\Bundle\DoctrineBundle\DoctrineBundle; -use Doctrine\ORM\Configuration; use Psr\Log\NullLogger; use Symfony\Bundle\FrameworkBundle\FrameworkBundle; use Symfony\Component\Config\Loader\LoaderInterface; @@ -12,7 +11,6 @@ use Symfony\Component\HttpKernel\Kernel; use function md5; -use function method_exists; use function mt_rand; use function sys_get_temp_dir; @@ -49,9 +47,6 @@ public function registerContainerConfiguration(LoaderInterface $loader): void 'schema_manager_factory' => 'doctrine.dbal.default_schema_manager_factory', ], 'orm' => [ - 'auto_generate_proxy_classes' => true, - /** @phpstan-ignore function.alreadyNarrowedType */ - 'enable_native_lazy_objects' => method_exists(Configuration::class, 'enableNativeLazyObjects'), 'mappings' => [ 'RepositoryServiceBundle' => [ 'type' => 'attribute', diff --git a/tests/DependencyInjection/Fixtures/config/xml/orm_imports.xml b/tests/DependencyInjection/Fixtures/config/xml/orm_imports.xml index 20e9b25a2..87cf395f4 100644 --- a/tests/DependencyInjection/Fixtures/config/xml/orm_imports.xml +++ b/tests/DependencyInjection/Fixtures/config/xml/orm_imports.xml @@ -11,6 +11,6 @@ - + diff --git a/tests/DependencyInjection/Fixtures/config/xml/orm_imports_import.xml b/tests/DependencyInjection/Fixtures/config/xml/orm_imports_import.xml index d3c0e30ab..eda2e9819 100644 --- a/tests/DependencyInjection/Fixtures/config/xml/orm_imports_import.xml +++ b/tests/DependencyInjection/Fixtures/config/xml/orm_imports_import.xml @@ -11,10 +11,7 @@ - + diff --git a/tests/DependencyInjection/Fixtures/config/xml/orm_proxy.xml b/tests/DependencyInjection/Fixtures/config/xml/orm_proxy.xml deleted file mode 100644 index a4410da97..000000000 --- a/tests/DependencyInjection/Fixtures/config/xml/orm_proxy.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/tests/DependencyInjection/Fixtures/config/xml/orm_service_multiple_entity_managers.xml b/tests/DependencyInjection/Fixtures/config/xml/orm_service_multiple_entity_managers.xml index 7f1c04034..4d7e0e33d 100644 --- a/tests/DependencyInjection/Fixtures/config/xml/orm_service_multiple_entity_managers.xml +++ b/tests/DependencyInjection/Fixtures/config/xml/orm_service_multiple_entity_managers.xml @@ -5,11 +5,6 @@ xmlns:srv="http://symfony.com/schema/dic/services" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd"> - - - Proxies - - - + diff --git a/tests/DependencyInjection/Fixtures/config/xml/orm_service_single_entity_manager.xml b/tests/DependencyInjection/Fixtures/config/xml/orm_service_single_entity_manager.xml index c4307843c..2a0f0e39d 100644 --- a/tests/DependencyInjection/Fixtures/config/xml/orm_service_single_entity_manager.xml +++ b/tests/DependencyInjection/Fixtures/config/xml/orm_service_single_entity_manager.xml @@ -5,11 +5,6 @@ xmlns:srv="http://symfony.com/schema/dic/services" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd"> - - - Proxies - - - + diff --git a/tests/DependencyInjection/Fixtures/config/yml/orm_imports.yml b/tests/DependencyInjection/Fixtures/config/yml/orm_imports.yml index df8794588..20919f2da 100644 --- a/tests/DependencyInjection/Fixtures/config/yml/orm_imports.yml +++ b/tests/DependencyInjection/Fixtures/config/yml/orm_imports.yml @@ -2,5 +2,4 @@ imports: - { resource: orm_imports_import.yml } doctrine: - orm: - auto_generate_proxy_classes: true + orm: ~ diff --git a/tests/DependencyInjection/Fixtures/config/yml/orm_imports_import.yml b/tests/DependencyInjection/Fixtures/config/yml/orm_imports_import.yml index a5b65bcc2..c18f1ad28 100644 --- a/tests/DependencyInjection/Fixtures/config/yml/orm_imports_import.yml +++ b/tests/DependencyInjection/Fixtures/config/yml/orm_imports_import.yml @@ -6,7 +6,6 @@ doctrine: dbname: db orm: - auto_generate_proxy_classes: false default_entity_manager: default entity_managers: default: diff --git a/tests/DependencyInjection/Fixtures/config/yml/orm_service_multiple_entity_managers.yml b/tests/DependencyInjection/Fixtures/config/yml/orm_service_multiple_entity_managers.yml index 0c28ea210..6e5e2d781 100644 --- a/tests/DependencyInjection/Fixtures/config/yml/orm_service_multiple_entity_managers.yml +++ b/tests/DependencyInjection/Fixtures/config/yml/orm_service_multiple_entity_managers.yml @@ -1,6 +1,3 @@ -parameters: - doctrine.orm.proxy_namespace: Proxies - doctrine: dbal: default_connection: conn1 @@ -20,7 +17,6 @@ doctrine: orm: default_entity_manager: em2 - auto_generate_proxy_classes: true entity_managers: em1: connection: conn1 diff --git a/tests/DependencyInjection/Fixtures/config/yml/orm_service_single_entity_manager.yml b/tests/DependencyInjection/Fixtures/config/yml/orm_service_single_entity_manager.yml index da64c9750..42e81c924 100644 --- a/tests/DependencyInjection/Fixtures/config/yml/orm_service_single_entity_manager.yml +++ b/tests/DependencyInjection/Fixtures/config/yml/orm_service_single_entity_manager.yml @@ -11,8 +11,6 @@ doctrine: orm: default_entity_manager: default - proxy_namespace: Proxies - auto_generate_proxy_classes: true entity_managers: default: connection: default diff --git a/tests/ServiceRepositoryTest.php b/tests/ServiceRepositoryTest.php index 47a43ab26..46938fa21 100644 --- a/tests/ServiceRepositoryTest.php +++ b/tests/ServiceRepositoryTest.php @@ -4,7 +4,6 @@ use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\ServiceRepositoryCompilerPass; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension; -use Doctrine\ORM\Configuration; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; @@ -20,7 +19,6 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use function interface_exists; -use function method_exists; use function sys_get_temp_dir; use function uniqid; @@ -79,8 +77,6 @@ public function testRepositoryServiceWiring(): void 'schema_manager_factory' => 'doctrine.dbal.default_schema_manager_factory', ], 'orm' => [ - /** @phpstan-ignore function.alreadyNarrowedType */ - 'enable_native_lazy_objects' => method_exists(Configuration::class, 'enableNativeLazyObjects'), 'mappings' => [ 'RepositoryServiceBundle' => [ 'type' => 'attribute', diff --git a/tests/TestCase.php b/tests/TestCase.php index a50c858a3..4b09ca073 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -4,7 +4,6 @@ use Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension; use Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestType; -use Doctrine\ORM\Configuration; use PHPUnit\Framework\TestCase as BaseTestCase; use Symfony\Component\Cache\Adapter\ArrayAdapter; use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; @@ -13,7 +12,6 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\Security\Core\User\UserInterface; -use function method_exists; use function sys_get_temp_dir; use function uniqid; @@ -67,8 +65,6 @@ public function createXmlBundleTestContainer(): ContainerBuilder ], ], 'resolve_target_entities' => [UserInterface::class => 'stdClass'], - /** @phpstan-ignore function.alreadyNarrowedType */ - 'enable_native_lazy_objects' => method_exists(Configuration::class, 'enableNativeLazyObjects'), ], ], ], $container); diff --git a/tests/baseline-ignore b/tests/baseline-ignore deleted file mode 100644 index edc13cd28..000000000 --- a/tests/baseline-ignore +++ /dev/null @@ -1 +0,0 @@ -%Not setting "doctrine.orm.enable_native_lazy_objects" to true is deprecated.%