Skip to content

Commit 2c727f5

Browse files
authored
feat: introduce ObjectBuilder::addField() (#125)
1 parent 361ac4d commit 2c727f5

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/Builder/ObjectBuilder.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use GraphQL\Type\Definition\InterfaceType;
99
use GraphQL\Type\Definition\ResolveInfo;
1010

11+
use function is_callable;
12+
1113
class ObjectBuilder extends TypeBuilder
1214
{
1315
/** @var InterfaceType[] */
@@ -49,6 +51,30 @@ public function setFields(callable|array $fields): self
4951
return $this;
5052
}
5153

54+
/**
55+
* @param FieldDefinition|array<string, mixed> $field
56+
*
57+
* @return $this
58+
*/
59+
public function addField(FieldDefinition|array $field): self
60+
{
61+
if (is_callable($this->fields)) {
62+
$originalFields = $this->fields;
63+
/** @var callable():array<FieldDefinition|array<string, mixed>> $closure */
64+
$closure = static function () use ($field, $originalFields): array {
65+
$originalFields = $originalFields();
66+
$originalFields[] = $field;
67+
68+
return $originalFields;
69+
};
70+
$this->fields = $closure;
71+
} else {
72+
$this->fields[] = $field;
73+
}
74+
75+
return $this;
76+
}
77+
5278
/**
5379
* @param callable(mixed, array<mixed>, mixed, ResolveInfo) : mixed $fieldResolver
5480
*

tests/Builder/ObjectBuilderTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,36 @@ public function __construct()
5454
self::assertCount(2, $object['fields']);
5555
}
5656

57+
public function testAddFields(): void
58+
{
59+
$builder = ObjectBuilder::create('Name');
60+
$object = $builder
61+
->setFields([
62+
FieldBuilder::create('SomeField', Type::string())->build(),
63+
])
64+
->addField(FieldBuilder::create('Foo', Type::string())->build())
65+
->build();
66+
67+
self::assertIsArray($object['fields']);
68+
self::assertCount(2, $object['fields']);
69+
}
70+
71+
public function testAddFieldsToCallable(): void
72+
{
73+
$builder = ObjectBuilder::create('Name');
74+
$object = $builder
75+
->setFields(static fn () => [
76+
FieldBuilder::create('SomeField', Type::string())->build(),
77+
])
78+
->addField(FieldBuilder::create('Foo', Type::string())->build())
79+
->build();
80+
81+
self::assertIsCallable($object['fields']);
82+
/** @var array<FieldDefinition|array<string, mixed>> $fields */
83+
$fields = $object['fields']();
84+
self::assertCount(2, $fields);
85+
}
86+
5787
public function testInvalidName(): void
5888
{
5989
$this->expectException(InvalidArgument::class);

0 commit comments

Comments
 (0)