Skip to content

Commit 02c6131

Browse files
authored
Fix promoted default values (#672)
* Fix FieldsBuilder ignoring promoted properties' default values * Add test for promoted default value * Fix code style * Fix code style
1 parent 59048a1 commit 02c6131

File tree

4 files changed

+21
-1
lines changed

4 files changed

+21
-1
lines changed

src/FieldsBuilder.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public function getInputFields(string $className, string $inputName, bool $isUpd
170170
$reflectorByFields = [];
171171

172172
$inputFields = [];
173-
$defaultProperties = $refClass->getDefaultProperties();
173+
$defaultProperties = $this->getClassDefaultProperties($refClass);
174174

175175
$closestMatchingTypeClass = null;
176176
$parent = get_parent_class($refClass->getName());
@@ -1143,4 +1143,20 @@ private function getClassConstructParameterNames(ReflectionClass $refClass): arr
11431143

11441144
return $names;
11451145
}
1146+
1147+
/** @return array<string, mixed> */
1148+
private function getClassDefaultProperties(ReflectionClass $refClass): array
1149+
{
1150+
$properties = $refClass->getDefaultProperties();
1151+
1152+
foreach ($refClass->getConstructor()?->getParameters() ?? [] as $parameter) {
1153+
if (! $parameter->isPromoted() || ! $parameter->isDefaultValueAvailable()) {
1154+
continue;
1155+
}
1156+
1157+
$properties[$parameter->getName()] = $parameter->getDefaultValue();
1158+
}
1159+
1160+
return $properties;
1161+
}
11461162
}

tests/Fixtures/Integration/Controllers/ArticleController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public function updateArticle(UpdateArticleInput $input): Article
4141
{
4242
$article = new Article('test');
4343
$article->magazine = $input->magazine;
44+
$article->summary = $input->summary;
4445

4546
return $article;
4647
}

tests/Fixtures/Integration/Models/UpdateArticleInput.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public function __construct(
1313
#[Field]
1414
#[Security("magazine != 'NYTimes'")]
1515
public readonly string|null $magazine,
16+
public readonly string $summary = 'default',
1617
)
1718
{
1819
}

tests/Integration/EndToEndTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,7 @@ public function testEndToEndInputConstructor(): void
19111911
magazine: "Test"
19121912
}) {
19131913
magazine
1914+
summary
19141915
}
19151916
}
19161917
';
@@ -1922,6 +1923,7 @@ public function testEndToEndInputConstructor(): void
19221923

19231924
$data = $this->getSuccessResult($result);
19241925
$this->assertSame('Test', $data['updateArticle']['magazine']);
1926+
$this->assertSame('default', $data['updateArticle']['summary']);
19251927
$queryString = '
19261928
mutation {
19271929
updateArticle(input: {

0 commit comments

Comments
 (0)