10
10
use GraphQL \SchemaGenerator \CodeGenerator \ObjectBuilderInterface ;
11
11
use GraphQL \SchemaGenerator \CodeGenerator \QueryObjectClassBuilder ;
12
12
use GraphQL \SchemaGenerator \CodeGenerator \UnionObjectBuilder ;
13
+ use GraphQL \SchemaGenerator \SchemaInspector \TypeSubQueryGenerator ;
13
14
use GraphQL \SchemaObject \QueryObject ;
14
15
use GraphQL \Util \StringLiteralFormatter ;
15
16
use RuntimeException ;
@@ -55,19 +56,21 @@ class SchemaClassGenerator
55
56
*/
56
57
public function __construct (Client $ client , string $ writeDir = '' , string $ namespace = ObjectBuilderInterface::DEFAULT_NAMESPACE )
57
58
{
58
- $ this ->schemaInspector = new SchemaInspector ($ client );
59
+ $ this ->schemaInspector = new SchemaInspector ($ client, new TypeSubQueryGenerator () );
59
60
$ this ->generatedObjects = [];
60
61
$ this ->writeDir = $ writeDir ;
61
62
$ this ->generationNamespace = $ namespace ;
62
63
$ this ->setWriteDir ();
63
64
}
64
65
65
66
/**
67
+ * @param int $typeOfTypeDepth
68
+ *
66
69
* @return bool
67
70
*/
68
- public function generateRootQueryObject (): bool
71
+ public function generateRootQueryObject (int $ typeOfTypeDepth = 4 ): bool
69
72
{
70
- $ objectArray = $ this ->schemaInspector ->getQueryTypeSchema ();
73
+ $ objectArray = $ this ->schemaInspector ->getQueryTypeSchema ($ typeOfTypeDepth );
71
74
$ rootObjectName = QueryObject::ROOT_QUERY_OBJECT_NAME ;
72
75
$ queryTypeName = $ objectArray ['name ' ];
73
76
//$rootObjectDescr = $objectArray['description'];
@@ -79,7 +82,7 @@ public function generateRootQueryObject(): bool
79
82
$ this ->generatedObjects [$ queryTypeName ] = true ;
80
83
81
84
$ queryObjectBuilder = new QueryObjectClassBuilder ($ this ->writeDir , $ rootObjectName , $ this ->generationNamespace );
82
- $ this ->appendQueryObjectFields ($ queryObjectBuilder , $ rootObjectName , $ objectArray ['fields ' ]);
85
+ $ this ->appendQueryObjectFields ($ queryObjectBuilder , $ rootObjectName , $ objectArray ['fields ' ], $ typeOfTypeDepth );
83
86
$ queryObjectBuilder ->build ();
84
87
85
88
return true ;
@@ -91,8 +94,9 @@ public function generateRootQueryObject(): bool
91
94
* @param QueryObjectClassBuilder $queryObjectBuilder
92
95
* @param string $currentTypeName
93
96
* @param array $fieldsArray
97
+ * @param int $typeOfTypeDepth
94
98
*/
95
- private function appendQueryObjectFields (QueryObjectClassBuilder $ queryObjectBuilder , string $ currentTypeName , array $ fieldsArray)
99
+ private function appendQueryObjectFields (QueryObjectClassBuilder $ queryObjectBuilder , string $ currentTypeName , array $ fieldsArray, int $ typeOfTypeDepth = 4 ): void
96
100
{
97
101
foreach ($ fieldsArray as $ fieldArray ) {
98
102
$ name = $ fieldArray ['name ' ];
@@ -110,7 +114,7 @@ private function appendQueryObjectFields(QueryObjectClassBuilder $queryObjectBui
110
114
} else {
111
115
112
116
// Generate nested type object if it wasn't generated
113
- $ objectGenerated = $ this ->generateObject ($ typeName , $ typeKind );
117
+ $ objectGenerated = $ this ->generateObject ($ typeName , $ typeKind, $ typeOfTypeDepth );
114
118
if ($ objectGenerated ) {
115
119
116
120
// Generate nested type arguments object if it wasn't generated
@@ -129,20 +133,21 @@ private function appendQueryObjectFields(QueryObjectClassBuilder $queryObjectBui
129
133
/**
130
134
* @param string $objectName
131
135
* @param string $objectKind
136
+ * @param int $typeOfTypeDepth
132
137
*
133
138
* @return bool
134
139
*/
135
- protected function generateObject (string $ objectName , string $ objectKind ): bool
140
+ protected function generateObject (string $ objectName , string $ objectKind, int $ typeOfTypeDepth = 4 ): bool
136
141
{
137
142
switch ($ objectKind ) {
138
143
case FieldTypeKindEnum::OBJECT :
139
- return $ this ->generateQueryObject ($ objectName );
144
+ return $ this ->generateQueryObject ($ objectName, $ typeOfTypeDepth );
140
145
case FieldTypeKindEnum::INPUT_OBJECT :
141
- return $ this ->generateInputObject ($ objectName );
146
+ return $ this ->generateInputObject ($ objectName, $ typeOfTypeDepth );
142
147
case FieldTypeKindEnum::ENUM_OBJECT :
143
148
return $ this ->generateEnumObject ($ objectName );
144
149
case FieldTypeKindEnum::UNION_OBJECT :
145
- return $ this ->generateUnionObject ($ objectName );
150
+ return $ this ->generateUnionObject ($ objectName, $ typeOfTypeDepth );
146
151
default :
147
152
print "Couldn't generate type $ objectName: generating $ objectKind kind is not supported yet " . PHP_EOL ;
148
153
return false ;
@@ -151,39 +156,41 @@ protected function generateObject(string $objectName, string $objectKind): bool
151
156
152
157
/**
153
158
* @param string $objectName
159
+ * @param int $typeOfTypeDepth
154
160
*
155
161
* @return bool
156
162
*/
157
- protected function generateQueryObject (string $ objectName ): bool
163
+ protected function generateQueryObject (string $ objectName, int $ typeOfTypeDepth = 4 ): bool
158
164
{
159
165
if (array_key_exists ($ objectName , $ this ->generatedObjects )) {
160
166
return true ;
161
167
}
162
168
163
169
$ this ->generatedObjects [$ objectName ] = true ;
164
- $ objectArray = $ this ->schemaInspector ->getObjectSchema ($ objectName );
170
+ $ objectArray = $ this ->schemaInspector ->getObjectSchema ($ objectName, $ typeOfTypeDepth );
165
171
$ objectName = $ objectArray ['name ' ];
166
172
$ objectBuilder = new QueryObjectClassBuilder ($ this ->writeDir , $ objectName , $ this ->generationNamespace );
167
173
168
- $ this ->appendQueryObjectFields ($ objectBuilder , $ objectName , $ objectArray ['fields ' ]);
174
+ $ this ->appendQueryObjectFields ($ objectBuilder , $ objectName , $ objectArray ['fields ' ], $ typeOfTypeDepth );
169
175
$ objectBuilder ->build ();
170
176
171
177
return true ;
172
178
}
173
179
174
180
/**
175
181
* @param string $objectName
182
+ * @param int $typeOfTypeDepth
176
183
*
177
184
* @return bool
178
185
*/
179
- protected function generateInputObject (string $ objectName ): bool
186
+ protected function generateInputObject (string $ objectName, int $ typeOfTypeDepth = 4 ): bool
180
187
{
181
188
if (array_key_exists ($ objectName , $ this ->generatedObjects )) {
182
189
return true ;
183
190
}
184
191
185
192
$ this ->generatedObjects [$ objectName ] = true ;
186
- $ objectArray = $ this ->schemaInspector ->getInputObjectSchema ($ objectName );
193
+ $ objectArray = $ this ->schemaInspector ->getInputObjectSchema ($ objectName, $ typeOfTypeDepth );
187
194
$ objectName = $ objectArray ['name ' ];
188
195
$ objectBuilder = new InputObjectClassBuilder ($ this ->writeDir , $ objectName , $ this ->generationNamespace );
189
196
@@ -195,7 +202,7 @@ protected function generateInputObject(string $objectName): bool
195
202
196
203
$ objectGenerated = true ;
197
204
if ($ typeKind !== FieldTypeKindEnum::SCALAR ) {
198
- $ objectGenerated = $ this ->generateObject ($ typeName , $ typeKind );
205
+ $ objectGenerated = $ this ->generateObject ($ typeName , $ typeKind, $ typeOfTypeDepth );
199
206
}
200
207
201
208
if ($ objectGenerated ) {
@@ -245,10 +252,11 @@ protected function generateEnumObject(string $objectName): bool
245
252
246
253
/**
247
254
* @param string $objectName
255
+ * @param int $typeOfTypeDepth
248
256
*
249
257
* @return bool
250
258
*/
251
- protected function generateUnionObject (string $ objectName ): bool
259
+ protected function generateUnionObject (string $ objectName, int $ typeOfTypeDepth = 4 ): bool
252
260
{
253
261
if (array_key_exists ($ objectName , $ this ->generatedObjects )) {
254
262
return true ;
@@ -261,7 +269,7 @@ protected function generateUnionObject(string $objectName): bool
261
269
$ objectBuilder = new UnionObjectBuilder ($ this ->writeDir , $ objectName , $ this ->generationNamespace );
262
270
263
271
foreach ($ objectArray ['possibleTypes ' ] as $ possibleType ) {
264
- $ this ->generateObject ($ possibleType ['name ' ], $ possibleType ['kind ' ]);
272
+ $ this ->generateObject ($ possibleType ['name ' ], $ possibleType ['kind ' ], $ typeOfTypeDepth );
265
273
$ objectBuilder ->addPossibleType ($ possibleType ['name ' ]);
266
274
}
267
275
$ objectBuilder ->build ();
@@ -272,10 +280,11 @@ protected function generateUnionObject(string $objectName): bool
272
280
/**
273
281
* @param string $argsObjectName
274
282
* @param array $arguments
283
+ * @param int $typeOfTypeDepth
275
284
*
276
285
* @return bool
277
286
*/
278
- protected function generateArgumentsObject (string $ argsObjectName , array $ arguments ): bool
287
+ protected function generateArgumentsObject (string $ argsObjectName , array $ arguments, int $ typeOfTypeDepth = 4 ): bool
279
288
{
280
289
if (array_key_exists ($ argsObjectName , $ this ->generatedObjects )) {
281
290
return true ;
@@ -293,7 +302,7 @@ protected function generateArgumentsObject(string $argsObjectName, array $argume
293
302
294
303
$ objectGenerated = true ;
295
304
if ($ typeKind !== FieldTypeKindEnum::SCALAR ) {
296
- $ objectGenerated = $ this ->generateObject ($ typeName , $ typeKind );
305
+ $ objectGenerated = $ this ->generateObject ($ typeName , $ typeKind, $ typeOfTypeDepth );
297
306
}
298
307
299
308
if ($ objectGenerated ) {
0 commit comments