Skip to content

Commit cc63f87

Browse files
committed
Try fixing Call to a member function getConfiguration() on null
1 parent 0aca96d commit cc63f87

15 files changed

+45
-36
lines changed

extension.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ services:
103103
class: PHPStan\Type\Doctrine\ObjectMetadataResolver
104104
arguments:
105105
objectManagerLoader: %doctrine.objectManagerLoader%
106+
tmpDir: %tmpDir%
106107
-
107108
class: PHPStan\Type\Doctrine\QueryBuilder\QueryBuilderGetDqlDynamicReturnTypeExtension
108109
arguments:

src/Doctrine/Mapping/ClassMetadataFactory.php

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,30 @@
44

55
use Doctrine\Common\Annotations\AnnotationReader;
66
use Doctrine\Common\Annotations\DocParser;
7-
use Doctrine\Common\EventManager;
8-
use Doctrine\DBAL\Platforms\MySqlPlatform;
7+
use Doctrine\DBAL\DriverManager;
8+
use Doctrine\ORM\Configuration;
9+
use Doctrine\ORM\EntityManager;
910
use Doctrine\ORM\Mapping\ClassMetadata;
1011
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
1112
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
12-
use ReflectionClass;
13+
use Doctrine\ORM\Proxy\ProxyFactory;
1314
use function class_exists;
1415
use function count;
1516
use const PHP_VERSION_ID;
1617

1718
class ClassMetadataFactory extends \Doctrine\ORM\Mapping\ClassMetadataFactory
1819
{
1920

20-
protected function initialize(): void
21+
/** @var string */
22+
private $tmpDir;
23+
24+
public function __construct(string $tmpDir)
2125
{
22-
$parentReflection = new ReflectionClass(parent::class);
23-
$driverProperty = $parentReflection->getProperty('driver');
24-
$driverProperty->setAccessible(true);
26+
$this->tmpDir = $tmpDir;
27+
}
2528

29+
protected function initialize(): void
30+
{
2631
$drivers = [];
2732
if (class_exists(AnnotationReader::class)) {
2833
$docParser = new DocParser();
@@ -33,23 +38,21 @@ protected function initialize(): void
3338
$drivers[] = new AttributeDriver([]);
3439
}
3540

36-
$driverProperty->setValue($this, count($drivers) === 1 ? $drivers[0] : new MappingDriverChain($drivers));
41+
$config = new Configuration();
42+
$config->setMetadataDriverImpl(count($drivers) === 1 ? $drivers[0] : new MappingDriverChain($drivers));
43+
$config->setAutoGenerateProxyClasses(ProxyFactory::AUTOGENERATE_FILE_NOT_EXISTS_OR_CHANGED);
44+
$config->setProxyDir($this->tmpDir);
45+
$config->setProxyNamespace('__PHPStanDoctrine__\\Proxy');
46+
$connection = DriverManager::getConnection([
47+
'driver' => 'pdo_sqlite',
48+
'memory' => true,
49+
], $config);
3750

38-
$evmProperty = $parentReflection->getProperty('evm');
39-
$evmProperty->setAccessible(true);
40-
$evmProperty->setValue($this, new EventManager());
41-
$this->initialized = true;
42-
43-
$targetPlatformProperty = $parentReflection->getProperty('targetPlatform');
44-
$targetPlatformProperty->setAccessible(true);
51+
$em = new EntityManager($connection, $config);
52+
$this->setEntityManager($em);
53+
parent::initialize();
4554

46-
if (class_exists(MySqlPlatform::class)) {
47-
$platform = new MySqlPlatform();
48-
} else {
49-
$platform = new \Doctrine\DBAL\Platforms\MySQLPlatform();
50-
}
51-
52-
$targetPlatformProperty->setValue($this, $platform);
55+
$this->initialized = true;
5356
}
5457

5558
/**

src/Type/Doctrine/ObjectMetadataResolver.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,16 @@ final class ObjectMetadataResolver
2626
/** @var ClassMetadataFactory|null */
2727
private $metadataFactory;
2828

29+
/** @var string */
30+
private $tmpDir;
31+
2932
public function __construct(
30-
?string $objectManagerLoader
33+
?string $objectManagerLoader,
34+
string $tmpDir
3135
)
3236
{
3337
$this->objectManagerLoader = $objectManagerLoader;
38+
$this->tmpDir = $tmpDir;
3439
}
3540

3641
public function hasObjectManagerLoader(): bool
@@ -97,7 +102,7 @@ private function getMetadataFactory(): ?ClassMetadataFactory
97102
return null;
98103
}
99104

100-
return $this->metadataFactory = new ClassMetadataFactory();
105+
return $this->metadataFactory = new ClassMetadataFactory($this->tmpDir);
101106
}
102107

103108
/**

tests/Rules/Doctrine/ORM/DqlRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class DqlRuleTest extends RuleTestCase
1414

1515
protected function getRule(): Rule
1616
{
17-
return new DqlRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php'));
17+
return new DqlRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp'));
1818
}
1919

2020
public function testRule(): void

tests/Rules/Doctrine/ORM/EntityColumnRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ protected function getRule(): Rule
5757
}
5858

5959
return new EntityColumnRule(
60-
new ObjectMetadataResolver($this->objectManagerLoader),
60+
new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp'),
6161
new DescriptorRegistry([
6262
new ArrayType(),
6363
new BigIntType(),

tests/Rules/Doctrine/ORM/EntityConstructorNotFinalRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class EntityConstructorNotFinalRuleTest extends RuleTestCase
1919
protected function getRule(): Rule
2020
{
2121
return new EntityConstructorNotFinalRule(
22-
new ObjectMetadataResolver($this->objectManagerLoader)
22+
new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp')
2323
);
2424
}
2525

tests/Rules/Doctrine/ORM/EntityMappingExceptionRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class EntityMappingExceptionRuleTest extends RuleTestCase
1616
protected function getRule(): Rule
1717
{
1818
return new EntityMappingExceptionRule(
19-
new ObjectMetadataResolver(__DIR__ . '/entity-manager.php')
19+
new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp')
2020
);
2121
}
2222

tests/Rules/Doctrine/ORM/EntityNotFinalRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class EntityNotFinalRuleTest extends RuleTestCase
1919
protected function getRule(): Rule
2020
{
2121
return new EntityNotFinalRule(
22-
new ObjectMetadataResolver($this->objectManagerLoader)
22+
new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp')
2323
);
2424
}
2525

tests/Rules/Doctrine/ORM/EntityRelationRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class EntityRelationRuleTest extends RuleTestCase
2323
protected function getRule(): Rule
2424
{
2525
return new EntityRelationRule(
26-
new ObjectMetadataResolver($this->objectManagerLoader),
26+
new ObjectMetadataResolver($this->objectManagerLoader, __DIR__ . '/../../../../tmp'),
2727
$this->allowNullablePropertyForRequiredField,
2828
true
2929
);

tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleSlowTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class QueryBuilderDqlRuleSlowTest extends RuleTestCase
1616
protected function getRule(): Rule
1717
{
1818
return new QueryBuilderDqlRule(
19-
new ObjectMetadataResolver(__DIR__ . '/entity-manager.php'),
19+
new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp'),
2020
self::getContainer()->getByType(OtherMethodQueryBuilderParser::class),
2121
true,
2222
true

tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class QueryBuilderDqlRuleTest extends RuleTestCase
1616
protected function getRule(): Rule
1717
{
1818
return new QueryBuilderDqlRule(
19-
new ObjectMetadataResolver(__DIR__ . '/entity-manager.php'),
19+
new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp'),
2020
self::getContainer()->getByType(OtherMethodQueryBuilderParser::class),
2121
true,
2222
true

tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class RepositoryMethodCallRuleTest extends RuleTestCase
1414

1515
protected function getRule(): Rule
1616
{
17-
return new RepositoryMethodCallRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php'));
17+
return new RepositoryMethodCallRule(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp'));
1818
}
1919

2020
/**

tests/Rules/Doctrine/ORM/RepositoryMethodCallRuleWithoutObjectManagerLoaderTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class RepositoryMethodCallRuleWithoutObjectManagerLoaderTest extends RuleTestCas
1414

1515
protected function getRule(): Rule
1616
{
17-
return new RepositoryMethodCallRule(new ObjectMetadataResolver(null));
17+
return new RepositoryMethodCallRule(new ObjectMetadataResolver(null, __DIR__ . '/../../../../tmp'));
1818
}
1919

2020
/**

tests/Rules/Properties/MissingGedmoByPhpDocPropertyAssignRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ protected function getRule(): Rule
2323
protected function getReadWritePropertiesExtensions(): array
2424
{
2525
return [
26-
new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php')),
26+
new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp')),
2727
];
2828
}
2929

tests/Rules/Properties/MissingGedmoPropertyAssignRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ protected function getRule(): Rule
2424
protected function getReadWritePropertiesExtensions(): array
2525
{
2626
return [
27-
new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php')),
27+
new PropertiesExtension(new ObjectMetadataResolver(__DIR__ . '/entity-manager.php', __DIR__ . '/../../../../tmp')),
2828
];
2929
}
3030

0 commit comments

Comments
 (0)