Skip to content

Commit 7de8b32

Browse files
committed
Catch MappingException in GetRepositoryDynamicReturnTypeExtension
1 parent b0a175d commit 7de8b32

7 files changed

+35
-15
lines changed

src/Type/Doctrine/GetRepositoryDynamicReturnTypeExtension.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ public function getTypeFromMethodCall(
6565
return $this->getDefaultReturnType($scope, $methodCall->args, $methodReflection);
6666
}
6767

68-
$repositoryClass = $this->metadataResolver->getRepositoryClass($objectName);
68+
try {
69+
$repositoryClass = $this->metadataResolver->getRepositoryClass($objectName);
70+
} catch (\Doctrine\ORM\Mapping\MappingException $e) {
71+
return $this->getDefaultReturnType($scope, $methodCall->args, $methodReflection);
72+
}
6973

7074
return new GenericObjectType($repositoryClass, [
7175
$classType,
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
[
22
{
33
"message": "Call to method Doctrine\\ORM\\EntityRepository<PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity>::findOneBy() - entity PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity does not have a field named $blah.",
4-
"line": 93,
4+
"line": 94,
55
"ignorable": true
66
},
77
{
88
"message": "Call to method Doctrine\\ORM\\EntityRepository<PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity>::findBy() - entity PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity does not have a field named $blah.",
9-
"line": 115,
9+
"line": 116,
1010
"ignorable": true
1111
}
1212
]
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
11
[
22
{
33
"message": "Call to an undefined method PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity::doSomethingElse().",
4-
"line": 88,
4+
"line": 89,
55
"ignorable": true
66
},
77
{
88
"message": "Call to an undefined method PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity::doSomethingElse().",
9-
"line": 100,
9+
"line": 101,
1010
"ignorable": true
1111
},
1212
{
1313
"message": "Call to an undefined method PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity::doSomethingElse().",
14-
"line": 109,
14+
"line": 110,
1515
"ignorable": true
1616
},
1717
{
1818
"message": "Call to an undefined method PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity::doSomethingElse().",
19-
"line": 119,
19+
"line": 120,
2020
"ignorable": true
2121
},
2222
{
2323
"message": "Call to an undefined method PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity::doSomethingElse().",
24-
"line": 141,
24+
"line": 142,
2525
"ignorable": true
2626
},
2727
{
2828
"message": "Call to an undefined method Doctrine\\ORM\\EntityRepository<PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity>::findByNonexistent().",
29-
"line": 147,
29+
"line": 148,
3030
"ignorable": true
3131
},
3232
{
3333
"message": "Call to an undefined method PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity::doSomethingElse().",
34-
"line": 159,
34+
"line": 160,
3535
"ignorable": true
3636
},
3737
{
3838
"message": "Call to an undefined method Doctrine\\ORM\\EntityRepository<PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity>::findOneByNonexistent().",
39-
"line": 164,
39+
"line": 165,
4040
"ignorable": true
4141
},
4242
{
4343
"message": "Call to an undefined method Doctrine\\ORM\\EntityRepository<PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\MyEntity>::countByNonexistent().",
44-
"line": 173,
44+
"line": 174,
4545
"ignorable": true
4646
}
4747
]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"message": "Strict comparison using === between int and 'foo' will always evaluate to false.",
4-
"line": 170,
4+
"line": 171,
55
"ignorable": true
66
}
77
]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"message": "Parameter #1 $className of method Doctrine\\Persistence\\ObjectManager::getRepository() expects class-string<nonexistentClass>, string given.",
4-
"line": 211,
4+
"line": 212,
55
"ignorable": true
66
}
77
]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"message": "Property PHPStan\\DoctrineIntegration\\ORM\\EntityRepositoryDynamicReturn\\Example::$repository with generic class Doctrine\\ORM\\EntityRepository does not specify its types: TEntityClass",
4-
"line": 15,
4+
"line": 16,
55
"ignorable": true
66
}
77
]

tests/DoctrineIntegration/ORM/data/entityRepositoryDynamicReturn.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\DoctrineIntegration\ORM\EntityRepositoryDynamicReturn;
44

5+
use Doctrine\ORM\EntityManager;
56
use Doctrine\ORM\EntityManagerInterface;
67
use Doctrine\ORM\EntityRepository;
78
use Doctrine\ORM\Mapping as ORM;
@@ -212,3 +213,18 @@ public function doBar(EntityManagerInterface $entityManager): void
212213
}
213214

214215
}
216+
217+
abstract class BaseEntity
218+
{
219+
220+
/**
221+
* @return EntityRepository<self>
222+
*/
223+
public function getRepository(): EntityRepository
224+
{
225+
return $this->getEntityManager()->getRepository(static::class);
226+
}
227+
228+
abstract public function getEntityManager(): EntityManager;
229+
230+
}

0 commit comments

Comments
 (0)