From cc63f870b6102fb3c1d48b4f87b57c4d59391e4e Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Fri, 17 Nov 2023 11:10:33 +0100 Subject: [PATCH] Try fixing `Call to a member function getConfiguration() on null` --- extension.neon | 1 + src/Doctrine/Mapping/ClassMetadataFactory.php | 47 ++++++++++--------- src/Type/Doctrine/ObjectMetadataResolver.php | 9 +++- tests/Rules/Doctrine/ORM/DqlRuleTest.php | 2 +- .../Doctrine/ORM/EntityColumnRuleTest.php | 2 +- .../ORM/EntityConstructorNotFinalRuleTest.php | 2 +- .../ORM/EntityMappingExceptionRuleTest.php | 2 +- .../Doctrine/ORM/EntityNotFinalRuleTest.php | 2 +- .../Doctrine/ORM/EntityRelationRuleTest.php | 2 +- .../ORM/QueryBuilderDqlRuleSlowTest.php | 2 +- .../Doctrine/ORM/QueryBuilderDqlRuleTest.php | 2 +- .../ORM/RepositoryMethodCallRuleTest.php | 2 +- ...CallRuleWithoutObjectManagerLoaderTest.php | 2 +- ...ingGedmoByPhpDocPropertyAssignRuleTest.php | 2 +- .../MissingGedmoPropertyAssignRuleTest.php | 2 +- 15 files changed, 45 insertions(+), 36 deletions(-) diff --git a/extension.neon b/extension.neon index 6412fe36..3ebe46b5 100644 --- a/extension.neon +++ b/extension.neon @@ -103,6 +103,7 @@ services: class: PHPStan\Type\Doctrine\ObjectMetadataResolver arguments: objectManagerLoader: %doctrine.objectManagerLoader% + tmpDir: %tmpDir% - class: PHPStan\Type\Doctrine\QueryBuilder\QueryBuilderGetDqlDynamicReturnTypeExtension arguments: diff --git a/src/Doctrine/Mapping/ClassMetadataFactory.php b/src/Doctrine/Mapping/ClassMetadataFactory.php index 3f3aa3ee..a1e791b9 100644 --- a/src/Doctrine/Mapping/ClassMetadataFactory.php +++ b/src/Doctrine/Mapping/ClassMetadataFactory.php @@ -4,12 +4,13 @@ use Doctrine\Common\Annotations\AnnotationReader; use Doctrine\Common\Annotations\DocParser; -use Doctrine\Common\EventManager; -use Doctrine\DBAL\Platforms\MySqlPlatform; +use Doctrine\DBAL\DriverManager; +use Doctrine\ORM\Configuration; +use Doctrine\ORM\EntityManager; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\Driver\AnnotationDriver; use Doctrine\ORM\Mapping\Driver\AttributeDriver; -use ReflectionClass; +use Doctrine\ORM\Proxy\ProxyFactory; use function class_exists; use function count; use const PHP_VERSION_ID; @@ -17,12 +18,16 @@ class ClassMetadataFactory extends \Doctrine\ORM\Mapping\ClassMetadataFactory { - protected function initialize(): void + /** @var string */ + private $tmpDir; + + public function __construct(string $tmpDir) { - $parentReflection = new ReflectionClass(parent::class); - $driverProperty = $parentReflection->getProperty('driver'); - $driverProperty->setAccessible(true); + $this->tmpDir = $tmpDir; + } + protected function initialize(): void + { $drivers = []; if (class_exists(AnnotationReader::class)) { $docParser = new DocParser(); @@ -33,23 +38,21 @@ protected function initialize(): void $drivers[] = new AttributeDriver([]); } - $driverProperty->setValue($this, count($drivers) === 1 ? $drivers[0] : new MappingDriverChain($drivers)); + $config = new Configuration(); + $config->setMetadataDriverImpl(count($drivers) === 1 ? $drivers[0] : new MappingDriverChain($drivers)); + $config->setAutoGenerateProxyClasses(ProxyFactory::AUTOGENERATE_FILE_NOT_EXISTS_OR_CHANGED); + $config->setProxyDir($this->tmpDir); + $config->setProxyNamespace('__PHPStanDoctrine__\\Proxy'); + $connection = DriverManager::getConnection([ + 'driver' => 'pdo_sqlite', + 'memory' => true, + ], $config); - $evmProperty = $parentReflection->getProperty('evm'); - $evmProperty->setAccessible(true); - $evmProperty->setValue($this, new EventManager()); - $this->initialized = true; - - $targetPlatformProperty = $parentReflection->getProperty('targetPlatform'); - $targetPlatformProperty->setAccessible(true); + $em = new EntityManager($connection, $config); + $this->setEntityManager($em); + parent::initialize(); - if (class_exists(MySqlPlatform::class)) { - $platform = new MySqlPlatform(); - } else { - $platform = new \Doctrine\DBAL\Platforms\MySQLPlatform(); - } - - $targetPlatformProperty->setValue($this, $platform); + $this->initialized = true; } /** diff --git a/src/Type/Doctrine/ObjectMetadataResolver.php b/src/Type/Doctrine/ObjectMetadataResolver.php index 00f491f2..ccc56ec3 100644 --- a/src/Type/Doctrine/ObjectMetadataResolver.php +++ b/src/Type/Doctrine/ObjectMetadataResolver.php @@ -26,11 +26,16 @@ final class ObjectMetadataResolver /** @var ClassMetadataFactory|null */ private $metadataFactory; + /** @var string */ + private $tmpDir; + public function __construct( - ?string $objectManagerLoader + ?string $objectManagerLoader, + string $tmpDir ) { $this->objectManagerLoader = $objectManagerLoader; + $this->tmpDir = $tmpDir; } public function hasObjectManagerLoader(): bool @@ -97,7 +102,7 @@ private function getMetadataFactory(): ?ClassMetadataFactory return null; } - return $this->metadataFactory = new ClassMetadataFactory(); + return $this->metadataFactory = new ClassMetadataFactory($this->tmpDir); } /** diff --git a/tests/Rules/Doctrine/ORM/DqlRuleTest.php b/tests/Rules/Doctrine/ORM/DqlRuleTest.php index df7579b2..c4cbe21d 100644 --- a/tests/Rules/Doctrine/ORM/DqlRuleTest.php +++ b/tests/Rules/Doctrine/ORM/DqlRuleTest.php @@ -14,7 +14,7 @@ class DqlRuleTest extends RuleTestCase protected function getRule(): Rule { - return new DqlRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php')); + return new DqlRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp')); } public function testRule(): void diff --git a/tests/Rules/Doctrine/ORM/EntityColumnRuleTest.php b/tests/Rules/Doctrine/ORM/EntityColumnRuleTest.php index 33daf255..06a7fa76 100644 --- a/tests/Rules/Doctrine/ORM/EntityColumnRuleTest.php +++ b/tests/Rules/Doctrine/ORM/EntityColumnRuleTest.php @@ -57,7 +57,7 @@ protected function getRule(): Rule } return new EntityColumnRule( - new ObjectMetadataResolver($this->objectManagerLoader), + new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp'), new DescriptorRegistry([ new ArrayType(), new BigIntType(), diff --git a/tests/Rules/Doctrine/ORM/EntityConstructorNotFinalRuleTest.php b/tests/Rules/Doctrine/ORM/EntityConstructorNotFinalRuleTest.php index de840136..7647704b 100644 --- a/tests/Rules/Doctrine/ORM/EntityConstructorNotFinalRuleTest.php +++ b/tests/Rules/Doctrine/ORM/EntityConstructorNotFinalRuleTest.php @@ -19,7 +19,7 @@ class EntityConstructorNotFinalRuleTest extends RuleTestCase protected function getRule(): Rule { return new EntityConstructorNotFinalRule( - new ObjectMetadataResolver($this->objectManagerLoader) + new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp') ); } diff --git a/tests/Rules/Doctrine/ORM/EntityMappingExceptionRuleTest.php b/tests/Rules/Doctrine/ORM/EntityMappingExceptionRuleTest.php index dc125c6a..26a4e744 100644 --- a/tests/Rules/Doctrine/ORM/EntityMappingExceptionRuleTest.php +++ b/tests/Rules/Doctrine/ORM/EntityMappingExceptionRuleTest.php @@ -16,7 +16,7 @@ class EntityMappingExceptionRuleTest extends RuleTestCase protected function getRule(): Rule { return new EntityMappingExceptionRule( - new ObjectMetadataResolver(__DIR__ . '/entity-manager.php') + new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp') ); } diff --git a/tests/Rules/Doctrine/ORM/EntityNotFinalRuleTest.php b/tests/Rules/Doctrine/ORM/EntityNotFinalRuleTest.php index d4ffb0fd..9f1494a7 100644 --- a/tests/Rules/Doctrine/ORM/EntityNotFinalRuleTest.php +++ b/tests/Rules/Doctrine/ORM/EntityNotFinalRuleTest.php @@ -19,7 +19,7 @@ class EntityNotFinalRuleTest extends RuleTestCase protected function getRule(): Rule { return new EntityNotFinalRule( - new ObjectMetadataResolver($this->objectManagerLoader) + new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp') ); } diff --git a/tests/Rules/Doctrine/ORM/EntityRelationRuleTest.php b/tests/Rules/Doctrine/ORM/EntityRelationRuleTest.php index ec089d73..cd83bebe 100644 --- a/tests/Rules/Doctrine/ORM/EntityRelationRuleTest.php +++ b/tests/Rules/Doctrine/ORM/EntityRelationRuleTest.php @@ -23,7 +23,7 @@ class EntityRelationRuleTest extends RuleTestCase protected function getRule(): Rule { return new EntityRelationRule( - new ObjectMetadataResolver($this->objectManagerLoader), + new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp'), $this->allowNullablePropertyForRequiredField, true ); diff --git a/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleSlowTest.php b/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleSlowTest.php index ea578ae3..655b89c7 100644 --- a/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleSlowTest.php +++ b/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleSlowTest.php @@ -16,7 +16,7 @@ class QueryBuilderDqlRuleSlowTest extends RuleTestCase protected function getRule(): Rule { return new QueryBuilderDqlRule( - new ObjectMetadataResolver(__DIR__ . '/entity-manager.php'), + new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp'), self::getContainer()->getByType(OtherMethodQueryBuilderParser::class), true, true diff --git a/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php b/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php index bbb6e1ca..5fa6082b 100644 --- a/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php +++ b/tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php @@ -16,7 +16,7 @@ class QueryBuilderDqlRuleTest extends RuleTestCase protected function getRule(): Rule { return new QueryBuilderDqlRule( - new ObjectMetadataResolver(__DIR__ . '/entity-manager.php'), + new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp'), self::getContainer()->getByType(OtherMethodQueryBuilderParser::class), true, true diff --git a/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleTest.php b/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleTest.php index 8edcd878..da10cbf3 100644 --- a/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleTest.php +++ b/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleTest.php @@ -14,7 +14,7 @@ class RepositoryMethodCallRuleTest extends RuleTestCase protected function getRule(): Rule { - return new RepositoryMethodCallRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php')); + return new RepositoryMethodCallRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp')); } /** diff --git a/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleWithoutObjectManagerLoaderTest.php b/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleWithoutObjectManagerLoaderTest.php index b63b361c..849d3675 100644 --- a/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleWithoutObjectManagerLoaderTest.php +++ b/tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleWithoutObjectManagerLoaderTest.php @@ -14,7 +14,7 @@ class RepositoryMethodCallRuleWithoutObjectManagerLoaderTest extends RuleTestCas protected function getRule(): Rule { - return new RepositoryMethodCallRule(new ObjectMetadataResolver(null)); + return new RepositoryMethodCallRule(new ObjectMetadataResolver(null, __DIR__ . '/../../../../tmp')); } /** diff --git a/tests/Rules/Properties/MissingGedmoByPhpDocPropertyAssignRuleTest.php b/tests/Rules/Properties/MissingGedmoByPhpDocPropertyAssignRuleTest.php index d4b8e0da..683ddff3 100644 --- a/tests/Rules/Properties/MissingGedmoByPhpDocPropertyAssignRuleTest.php +++ b/tests/Rules/Properties/MissingGedmoByPhpDocPropertyAssignRuleTest.php @@ -23,7 +23,7 @@ protected function getRule(): Rule protected function getReadWritePropertiesExtensions(): array { return [ - new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php')), + new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp')), ]; } diff --git a/tests/Rules/Properties/MissingGedmoPropertyAssignRuleTest.php b/tests/Rules/Properties/MissingGedmoPropertyAssignRuleTest.php index f9dcda7d..60671537 100644 --- a/tests/Rules/Properties/MissingGedmoPropertyAssignRuleTest.php +++ b/tests/Rules/Properties/MissingGedmoPropertyAssignRuleTest.php @@ -24,7 +24,7 @@ protected function getRule(): Rule protected function getReadWritePropertiesExtensions(): array { return [ - new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php')), + new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp')), ]; }