Skip to content

Commit 13d3655

Browse files
Introduce default hydration mode
1 parent 31a924b commit 13d3655

File tree

6 files changed

+30
-13
lines changed

6 files changed

+30
-13
lines changed

src/Type/Doctrine/HydrationModeReturnTypeResolver.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace PHPStan\Type\Doctrine;
44

55
use Doctrine\ORM\AbstractQuery;
6-
use Doctrine\Persistence\ObjectManager;
76
use PHPStan\Type\Accessory\AccessoryArrayListType;
87
use PHPStan\Type\ArrayType;
98
use PHPStan\Type\BenevolentUnionType;
@@ -25,7 +24,7 @@ public function getMethodReturnTypeForHydrationMode(
2524
Type $hydrationMode,
2625
Type $queryKeyType,
2726
Type $queryResultType,
28-
?ObjectManager $objectManager
27+
?Type $defaultHydrationModeType = null
2928
): ?Type
3029
{
3130
$isVoidType = (new VoidType())->isSuperTypeOf($queryResultType);
@@ -42,6 +41,10 @@ public function getMethodReturnTypeForHydrationMode(
4241
return null;
4342
}
4443

44+
if ($defaultHydrationModeType !== null && $hydrationMode->isNull()->yes()) {
45+
$hydrationMode = $defaultHydrationModeType;
46+
}
47+
4548
if (!$hydrationMode instanceof ConstantIntegerType) {
4649
return null;
4750
}

src/Type/Doctrine/Query/QueryResultDynamicReturnTypeExtension.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use PHPStan\Reflection\ParametersAcceptorSelector;
1010
use PHPStan\ShouldNotHappenException;
1111
use PHPStan\Type\Doctrine\HydrationModeReturnTypeResolver;
12-
use PHPStan\Type\Doctrine\ObjectMetadataResolver;
1312
use PHPStan\Type\DynamicMethodReturnTypeExtension;
1413
use PHPStan\Type\NullType;
1514
use PHPStan\Type\Type;
@@ -27,16 +26,12 @@ final class QueryResultDynamicReturnTypeExtension implements DynamicMethodReturn
2726
'getSingleResult' => 0,
2827
];
2928

30-
private ObjectMetadataResolver $objectMetadataResolver;
31-
3229
private HydrationModeReturnTypeResolver $hydrationModeReturnTypeResolver;
3330

3431
public function __construct(
35-
ObjectMetadataResolver $objectMetadataResolver,
3632
HydrationModeReturnTypeResolver $hydrationModeReturnTypeResolver
3733
)
3834
{
39-
$this->objectMetadataResolver = $objectMetadataResolver;
4035
$this->hydrationModeReturnTypeResolver = $hydrationModeReturnTypeResolver;
4136
}
4237

@@ -84,7 +79,7 @@ public function getTypeFromMethodCall(
8479
$hydrationMode,
8580
$queryType->getTemplateType(AbstractQuery::class, 'TKey'),
8681
$queryType->getTemplateType(AbstractQuery::class, 'TResult'),
87-
$this->objectMetadataResolver->getObjectManager(),
82+
$queryType->getTemplateType(AbstractQuery::class, 'THydrationMode'),
8883
);
8984
}
9085

src/Type/Doctrine/Query/QueryType.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,25 @@ class QueryType extends GenericObjectType
1515

1616
private Type $resultType;
1717

18+
private Type $defaultHydrationModeType;
19+
1820
private string $dql;
1921

20-
public function __construct(string $dql, ?Type $indexType = null, ?Type $resultType = null, ?Type $subtractedType = null)
21-
{
22+
public function __construct(
23+
string $dql,
24+
?Type $indexType = null,
25+
?Type $resultType = null,
26+
?Type $subtractedType = null,
27+
?Type $defaultHydrationModeType = null
28+
) {
2229
$this->indexType = $indexType ?? new MixedType();
2330
$this->resultType = $resultType ?? new MixedType();
31+
$this->defaultHydrationModeType = $defaultHydrationModeType ?? new MixedType();
2432

2533
parent::__construct('Doctrine\ORM\Query', [
2634
$this->indexType,
2735
$this->resultType,
36+
$this->defaultHydrationModeType,
2837
], $subtractedType);
2938

3039
$this->dql = $dql;
@@ -41,7 +50,7 @@ public function equals(Type $type): bool
4150

4251
public function changeSubtractedType(?Type $subtractedType): Type
4352
{
44-
return new self('Doctrine\ORM\Query', $this->indexType, $this->resultType, $subtractedType);
53+
return new self('Doctrine\ORM\Query', $this->indexType, $this->resultType, $subtractedType, $this->defaultHydrationModeType);
4554
}
4655

4756
public function isSuperTypeOf(Type $type): IsSuperTypeOfResult

stubs/ORM/AbstractQuery.stub

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use Doctrine\ORM\NoResultException;
99
/**
1010
* @template-covariant TKey The type of column used in indexBy
1111
* @template-covariant TResult The type of results returned by this query in HYDRATE_OBJECT mode
12+
* @template-covariant THydrationMode = AbstractQuery::HYDRATE_OBJECT The default hydration mode when none is provided
1213
*/
1314
abstract class AbstractQuery
1415
{
@@ -84,4 +85,13 @@ abstract class AbstractQuery
8485
{
8586
}
8687

88+
/**
89+
* @template TNewHydrationMode of string|AbstractQuery::HYDRATE_*
90+
* @param TNewHydrationMode $hydrationMode
91+
* @phpstan-self-out self<TKey, TResult, TNewHydrationMode>
92+
*/
93+
public function setHydrationMode(string|int $hydrationMode): static
94+
{
95+
}
96+
8797
}

stubs/ORM/Query.stub

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ namespace Doctrine\ORM;
55
/**
66
* @template-covariant TKey The type of column used in indexBy
77
* @template-covariant TResult The type of results returned by this query in HYDRATE_OBJECT mode
8+
* @template-covariant THydrationMode = AbstractQuery::HYDRATE_OBJECT The default hydration mode when none is provided
89
*
9-
* @extends AbstractQuery<TKey, TResult>
10+
* @extends AbstractQuery<TKey, TResult, THydrationMode>
1011
*/
1112
final class Query extends AbstractQuery
1213
{

tests/Type/Doctrine/Query/QueryResultTypeWalkerHydrationModeTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ public function test(Type $expectedType, string $dql, string $methodName, ?int $
9191
new ConstantIntegerType($this->getRealHydrationMode($methodName, $hydrationMode)),
9292
$typeBuilder->getIndexType(),
9393
$typeBuilder->getResultType(),
94-
$entityManager,
9594
) ?? new MixedType();
9695

9796
self::assertSame(

0 commit comments

Comments
 (0)