1 | <?php |
||||
2 | |||||
3 | namespace Swaggest\PhpCodeBuilder\JsonSchema; |
||||
4 | |||||
5 | |||||
6 | use Swaggest\CodeBuilder\PlaceholderString; |
||||
7 | use Swaggest\JsonSchema\Constraint\Type; |
||||
8 | use Swaggest\JsonSchema\Schema; |
||||
9 | use Swaggest\JsonSchema\SchemaContract; |
||||
10 | use Swaggest\JsonSchema\Structure\ClassStructure; |
||||
11 | use Swaggest\JsonSchema\Structure\ObjectItem; |
||||
12 | use Swaggest\PhpCodeBuilder\PhpClass; |
||||
13 | use Swaggest\PhpCodeBuilder\PhpCode; |
||||
14 | use Swaggest\PhpCodeBuilder\PhpConstant; |
||||
15 | use Swaggest\PhpCodeBuilder\Types\ReferenceTypeOf; |
||||
16 | use Swaggest\PhpCodeBuilder\Types\TypeOf; |
||||
17 | |||||
18 | class SchemaBuilder |
||||
19 | { |
||||
20 | /** @var Schema */ |
||||
21 | private $schema; |
||||
22 | /** @var string */ |
||||
23 | private $varName; |
||||
24 | /** @var bool */ |
||||
25 | private $createVarName; |
||||
26 | |||||
27 | /** @var PhpBuilder */ |
||||
28 | private $phpBuilder; |
||||
29 | /** @var string */ |
||||
30 | private $path; |
||||
31 | |||||
32 | /** @var PhpCode */ |
||||
33 | private $result; |
||||
34 | |||||
35 | /** @var bool */ |
||||
36 | private $skipProperties; |
||||
37 | |||||
38 | /** @var PhpClass */ |
||||
39 | private $saveEnumConstInClass; |
||||
40 | |||||
41 | /** |
||||
42 | * SchemaBuilder constructor. |
||||
43 | * @param Schema|SchemaContract $schema |
||||
44 | * @param string $varName |
||||
45 | * @param string $path |
||||
46 | * @param PhpBuilder $phpBuilder |
||||
47 | * @param bool $createVarName |
||||
48 | 11 | * @throws \Exception |
|||
49 | */ |
||||
50 | 11 | public function __construct($schema, $varName, $path, PhpBuilder $phpBuilder, $createVarName = true) |
|||
51 | 11 | { |
|||
52 | 11 | if (!$schema instanceof Schema) { |
|||
53 | 11 | throw new Exception('Could not find Schema instance in SchemaContract: ' . get_class($schema)); |
|||
54 | 11 | } |
|||
55 | 11 | $this->schema = $schema; |
|||
56 | $this->varName = $varName; |
||||
57 | 11 | $this->phpBuilder = $phpBuilder; |
|||
58 | $this->path = $path; |
||||
59 | 11 | $this->createVarName = $createVarName; |
|||
60 | 7 | } |
|||
61 | |||||
62 | 4 | private function processType() |
|||
63 | 3 | { |
|||
64 | 4 | if ($this->schema->type !== null) { |
|||
65 | 4 | switch ($this->schema->type) { |
|||
66 | case Type::INTEGER: |
||||
67 | $result = $this->createVarName |
||||
68 | 5 | ? "{$this->varName} = ::schema::integer();" |
|||
69 | 4 | : "{$this->varName}->type = ::schema::INTEGER;"; |
|||
70 | 5 | break; |
|||
71 | 5 | ||||
72 | case Type::NUMBER: |
||||
73 | $result = $this->createVarName |
||||
74 | 5 | ? "{$this->varName} = ::schema::number();" |
|||
75 | 5 | : "{$this->varName}->type = ::schema::NUMBER;"; |
|||
76 | 5 | break; |
|||
77 | 5 | ||||
78 | case Type::BOOLEAN: |
||||
79 | $result = $this->createVarName |
||||
80 | 6 | ? "{$this->varName} = ::schema::boolean();" |
|||
81 | 6 | : "{$this->varName}->type = ::schema::BOOLEAN;"; |
|||
82 | 6 | break; |
|||
83 | 6 | ||||
84 | case Type::STRING: |
||||
85 | $result = $this->createVarName |
||||
86 | 3 | ? "{$this->varName} = ::schema::string();" |
|||
87 | 3 | : "{$this->varName}->type = ::schema::STRING;"; |
|||
88 | 3 | break; |
|||
89 | 3 | ||||
90 | case Type::ARR: |
||||
91 | $result = $this->createVarName |
||||
92 | 7 | ? "{$this->varName} = ::schema::arr();" |
|||
93 | : "{$this->varName}->type = ::schema::_ARRAY;"; |
||||
94 | break; |
||||
95 | 1 | ||||
96 | 1 | case Type::OBJECT: |
|||
97 | 1 | return; |
|||
98 | 1 | ||||
99 | case Type::NULL: |
||||
100 | $result = $this->createVarName |
||||
101 | ? "{$this->varName} = ::schema::null();" |
||||
102 | : "{$this->varName}->type = ::schema::NULL;"; |
||||
103 | break; |
||||
104 | 7 | ||||
105 | default: |
||||
106 | if (!is_array($this->schema->type)) { |
||||
107 | 8 | throw new Exception('Unexpected type:' . $this->schema->type); |
|||
108 | 8 | } |
|||
109 | $types = []; |
||||
110 | foreach ($this->schema->type as $type) { |
||||
111 | $types[] = '::schema::' . PhpCode::makePhpConstantName($type); |
||||
112 | 11 | } |
|||
113 | 11 | $types = '[' . implode(', ', $types) . ']'; |
|||
114 | 11 | $result = $this->createVarName |
|||
115 | ? "{$this->varName} = (new ::schema())->setType($types);" |
||||
116 | : "{$this->varName}->type = $types;"; |
||||
117 | 11 | } |
|||
118 | } else { |
||||
119 | 11 | if ($this->createVarName) { |
|||
120 | $result = "{$this->varName} = new ::schema();"; |
||||
121 | 11 | } |
|||
122 | } |
||||
123 | 11 | ||||
124 | if (isset($result)) { |
||||
125 | 8 | $this->result->addSnippet( |
|||
126 | 8 | new PlaceholderString($result . "\n", array('::schema' => new ReferenceTypeOf(Palette::schemaClass()))) |
|||
0 ignored issues
–
show
Deprecated Code
introduced
by
![]() |
|||||
127 | ); |
||||
128 | } |
||||
129 | } |
||||
130 | |||||
131 | private function processNamedClass() |
||||
132 | 8 | { |
|||
133 | 8 | if (!$this->skipProperties |
|||
134 | 8 | //&& $this->schema->type === Type::OBJECT |
|||
135 | && $this->schema->properties !== null |
||||
136 | ) { |
||||
137 | 8 | $class = $this->phpBuilder->getClass($this->schema, $this->path); |
|||
138 | if ($this->schema->id === 'http://json-schema.org/draft-04/schema#') { |
||||
139 | 11 | $this->result->addSnippet( |
|||
140 | new PlaceholderString("{$this->varName} = ::class::schema();\n", |
||||
141 | array('::class' => new TypeOf(Palette::schemaClass()))) |
||||
142 | 11 | ); |
|||
143 | } else { |
||||
144 | 11 | $this->result->addSnippet( |
|||
145 | new PlaceholderString("{$this->varName} = ::class::schema();\n", |
||||
146 | 11 | array('::class' => new TypeOf($class))) |
|||
147 | 11 | ); |
|||
148 | } |
||||
149 | 1 | return true; |
|||
150 | 1 | } |
|||
151 | return false; |
||||
152 | } |
||||
153 | |||||
154 | private function processRef() |
||||
155 | { |
||||
156 | 1 | if (!$this->skipProperties |
|||
157 | 1 | //&& $this->schema->type === Type::OBJECT |
|||
158 | 1 | && !$this->phpBuilder->minimizeRefs |
|||
159 | && $this->schema->getFromRefs() |
||||
160 | ) { |
||||
161 | 1 | $class = $this->phpBuilder->getClass($this->schema, $this->path); |
|||
162 | if ($this->schema->id === 'http://json-schema.org/draft-04/schema#') { |
||||
163 | 11 | $this->result->addSnippet( |
|||
164 | new PlaceholderString("{$this->varName} = ::class::schema();\n", |
||||
165 | array('::class' => new TypeOf(Palette::schemaClass()))) |
||||
166 | ); |
||||
167 | } else { |
||||
168 | $this->result->addSnippet( |
||||
169 | new PlaceholderString("{$this->varName} = ::class::schema();\n", |
||||
170 | 11 | array('::class' => new TypeOf($class))) |
|||
171 | ); |
||||
172 | 11 | } |
|||
173 | 7 | return true; |
|||
174 | 3 | } |
|||
175 | 3 | return false; |
|||
176 | 3 | } |
|||
177 | |||||
178 | |||||
179 | 7 | /** |
|||
180 | 7 | * @throws Exception |
|||
181 | */ |
||||
182 | private function processObject() |
||||
183 | { |
||||
184 | if ($this->schema->type === Type::OBJECT) { |
||||
185 | if (!$this->skipProperties) { |
||||
186 | $this->result->addSnippet( |
||||
187 | 11 | new PlaceholderString("{$this->varName} = ::schema::object();\n", |
|||
188 | 4 | array('::schema' => new TypeOf(Palette::schemaClass()))) |
|||
189 | 3 | ); |
|||
190 | 3 | } else { |
|||
191 | 3 | $this->result->addSnippet( |
|||
192 | 3 | new PlaceholderString("{$this->varName}->type = ::schema::OBJECT;\n", |
|||
193 | 3 | array('::schema' => new TypeOf(Palette::schemaClass()))) |
|||
194 | 3 | ); |
|||
195 | 3 | } |
|||
196 | |||||
197 | } |
||||
198 | 3 | ||||
199 | 3 | ||||
200 | 3 | if ($this->schema->additionalProperties !== null) { |
|||
201 | if ($this->schema->additionalProperties instanceof Schema) { |
||||
202 | $this->result->addSnippet( |
||||
203 | $this->copyTo(new SchemaBuilder( |
||||
204 | $this->schema->additionalProperties, |
||||
205 | 11 | "{$this->varName}->additionalProperties", |
|||
206 | 4 | $this->path . '->additionalProperties', |
|||
207 | 4 | $this->phpBuilder |
|||
208 | 4 | ))->build() |
|||
209 | 4 | ); |
|||
210 | 4 | } else { |
|||
211 | 4 | $val = $this->schema->additionalProperties ? 'true' : 'false'; |
|||
212 | 4 | $this->result->addSnippet( |
|||
213 | 4 | "{$this->varName}->additionalProperties = $val;\n" |
|||
214 | 4 | ); |
|||
215 | } |
||||
216 | 4 | } |
|||
217 | |||||
218 | if ($this->schema->patternProperties !== null) { |
||||
219 | foreach ($this->schema->patternProperties as $pattern => $property) { |
||||
220 | 11 | if ($property instanceof Schema) { |
|||
221 | $varName = '$' . PhpCode::makePhpName($pattern); |
||||
222 | $patternExp = var_export($pattern, true); |
||||
223 | $this->result->addSnippet( |
||||
224 | $this->copyTo(new SchemaBuilder( |
||||
225 | 11 | $property, |
|||
226 | $varName, |
||||
227 | 11 | $this->path . "->patternProperties->{{$pattern}}", |
|||
228 | $this->phpBuilder |
||||
229 | 11 | ))->build() |
|||
230 | 2 | ); |
|||
231 | 2 | $this->result->addSnippet("{$this->varName}->setPatternProperty({$patternExp}, $varName);\n"); |
|||
232 | 2 | } |
|||
233 | } |
||||
234 | } |
||||
235 | } |
||||
236 | 11 | ||||
237 | 11 | /** |
|||
238 | 2 | * @throws Exception |
|||
239 | 2 | */ |
|||
240 | 2 | private function processArray() |
|||
241 | 11 | { |
|||
242 | 11 | $schema = $this->schema; |
|||
243 | 11 | ||||
244 | if (is_bool($schema->additionalItems)) { |
||||
245 | $val = $schema->additionalItems ? 'true' : 'false'; |
||||
246 | $this->result->addSnippet( |
||||
247 | "{$this->varName}->additionalItems = $val;\n" |
||||
248 | ); |
||||
249 | } |
||||
250 | 11 | ||||
251 | 11 | $pathItems = 'items'; |
|||
252 | 2 | if ($schema->items instanceof ClassStructure) { // todo better check for schema, `getJsonSchema` interface ? |
|||
253 | 2 | $additionalItems = $schema->items; |
|||
0 ignored issues
–
show
It seems like
$schema->items can also be of type Swaggest\JsonSchema\Structure\ClassStructure . However, the property $items is declared as type Swaggest\JsonSchema\Sche...a\SchemaContract[]|null . Maybe add an additional type check?
Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly. For example, imagine you have a variable Either this assignment is in error or a type check should be added for that assignment. class Id
{
public $id;
public function __construct($id)
{
$this->id = $id;
}
}
class Account
{
/** @var Id $id */
public $id;
}
$account_id = false;
if (starsAreRight()) {
$account_id = new Id(42);
}
$account = new Account();
if ($account instanceof Id)
{
$account->id = $account_id;
}
![]() |
|||||
254 | 2 | $pathItems = 'items'; |
|||
255 | 2 | } elseif ($schema->items === null) { // items defaults to empty schema so everything is valid |
|||
256 | 2 | $additionalItems = true; |
|||
257 | 2 | } else { // listed items |
|||
258 | 2 | $additionalItems = $schema->additionalItems; |
|||
259 | $pathItems = 'additionalItems'; |
||||
260 | } |
||||
261 | |||||
262 | 11 | if ($additionalItems instanceof ClassStructure) { |
|||
263 | $this->result->addSnippet( |
||||
264 | 11 | $this->copyTo(new SchemaBuilder( |
|||
265 | $additionalItems, |
||||
266 | 11 | "{$this->varName}->{$pathItems}", |
|||
267 | 7 | $this->path . '->' . $pathItems, |
|||
268 | 7 | $this->phpBuilder |
|||
269 | ))->build() |
||||
270 | 7 | ); |
|||
271 | 7 | } |
|||
272 | } |
||||
273 | |||||
274 | 7 | private function processEnum() |
|||
275 | { |
||||
276 | 7 | if (!empty($this->schema->enum)) { |
|||
277 | 7 | $this->result->addSnippet( |
|||
278 | 3 | "{$this->varName}->enum = array(\n" |
|||
279 | 3 | ); |
|||
280 | 3 | foreach ($this->schema->enum as $i => $enumItem) { |
|||
281 | if (isset($this->schema->{Schema::ENUM_NAMES_PROPERTY}[$i])) { |
||||
282 | $name = PhpCode::makePhpConstantName($this->schema->{Schema::ENUM_NAMES_PROPERTY}[$i]); |
||||
283 | 6 | } else { |
|||
284 | 6 | $name = PhpCode::makePhpConstantName($enumItem); |
|||
285 | } |
||||
286 | $value = var_export($enumItem, true); |
||||
287 | if ($this->saveEnumConstInClass !== null && is_scalar($enumItem) && !is_bool($enumItem)) { |
||||
288 | $checkName = $name; |
||||
289 | 7 | $i = 1; |
|||
290 | 7 | do { |
|||
291 | try { |
||||
292 | $this->saveEnumConstInClass->addConstant(new PhpConstant($checkName, $enumItem)); |
||||
293 | $name = $checkName; |
||||
294 | 11 | break; |
|||
295 | } catch (\Swaggest\PhpCodeBuilder\Exception $exception) { |
||||
296 | $i++; |
||||
297 | $checkName = $name . $i; |
||||
298 | } |
||||
299 | } while(true); |
||||
300 | $this->result->addSnippet( |
||||
301 | " self::$name,\n" |
||||
302 | ); |
||||
303 | } else { |
||||
304 | 9 | $this->result->addSnippet( |
|||
305 | " $value,\n" |
||||
306 | 9 | ); |
|||
307 | 9 | } |
|||
308 | 9 | ||||
309 | } |
||||
310 | $this->result->addSnippet( |
||||
311 | 11 | ");\n" |
|||
312 | ); |
||||
313 | 11 | ||||
314 | 11 | } |
|||
315 | 1 | } |
|||
316 | |||||
317 | 1 | private $skip = []; |
|||
318 | 1 | ||||
319 | 1 | public function skipProperty($name) |
|||
320 | 1 | { |
|||
321 | 1 | $this->skip[$name] = 1; |
|||
322 | 1 | return $this; |
|||
323 | 1 | } |
|||
324 | 1 | ||||
325 | 1 | private function copyTo(SchemaBuilder $schemaBuilder) |
|||
326 | 1 | { |
|||
327 | 1 | $schemaBuilder->skip = $this->skip; |
|||
328 | 1 | $schemaBuilder->saveEnumConstInClass = $this->saveEnumConstInClass; |
|||
329 | 1 | return $schemaBuilder; |
|||
330 | 1 | } |
|||
331 | 1 | ||||
332 | 1 | /** |
|||
333 | 1 | * @throws \Swaggest\JsonSchema\InvalidValue |
|||
334 | 1 | */ |
|||
335 | private function processOther() |
||||
336 | { |
||||
337 | 11 | static $skip = null, $emptySchema = null, $names = null; |
|||
338 | 11 | if ($skip === null) { |
|||
339 | 11 | $emptySchema = new Schema(); |
|||
340 | 11 | $names = Schema::names(); |
|||
341 | $skip = array( |
||||
342 | 7 | $names->type => 1, |
|||
343 | Schema::PROP_REF => 1, |
||||
344 | $names->items => 1, |
||||
345 | $names->additionalItems => 1, |
||||
346 | $names->properties => 1, |
||||
347 | $names->additionalProperties => 1, |
||||
348 | 7 | $names->patternProperties => 1, |
|||
349 | $names->allOf => 1, // @todo process |
||||
350 | $names->anyOf => 1, |
||||
351 | 7 | $names->oneOf => 1, |
|||
352 | 2 | $names->not => 1, |
|||
353 | 7 | $names->definitions => 1, |
|||
354 | 2 | $names->enum => 1, |
|||
355 | $names->if => 1, |
||||
356 | 7 | $names->then => 1, |
|||
357 | $names->else => 1, |
||||
358 | ); |
||||
359 | 7 | } |
|||
360 | 7 | $schemaData = Schema::export($this->schema); |
|||
361 | 7 | foreach ((array)$schemaData as $key => $value) { |
|||
362 | if (isset($skip[$key])) { |
||||
363 | continue; |
||||
364 | 11 | } |
|||
365 | if (isset($this->skip[$key])) { |
||||
366 | 11 | continue; |
|||
367 | } |
||||
368 | 11 | ||||
369 | 11 | if (!property_exists($emptySchema, $key) && $key !== $names->const && $key !== $names->default |
|||
370 | 11 | && $key[0] !== '$') { |
|||
371 | 4 | continue; |
|||
372 | 4 | } |
|||
373 | 4 | ||||
374 | 4 | if ($names->required == $key && is_array($value)) { |
|||
375 | 4 | $export = "array(\n"; |
|||
376 | 4 | foreach ($value as $item) { |
|||
377 | 4 | if (PhpCode::makePhpName($item) === $item) { |
|||
378 | $expItem = 'self::names()->' . $item; |
||||
379 | } else { |
||||
380 | $expItem = PhpCode::varExport($item); |
||||
381 | } |
||||
382 | $export .= ' ' . $expItem . ",\n"; |
||||
383 | 11 | } |
|||
384 | 11 | $export .= ")"; |
|||
385 | 6 | $this->result->addSnippet( |
|||
386 | 6 | "{$this->varName}->{$key} = " . $export . ";\n" |
|||
387 | 6 | ); |
|||
388 | 6 | continue; |
|||
389 | 6 | } |
|||
390 | 6 | ||||
391 | 6 | //$this->result->addSnippet('/* ' . print_r($value, 1) . '*/' . "\n"); |
|||
392 | 6 | //echo "{$this->varName}->{$key}\n"; |
|||
393 | if ($value instanceof ObjectItem) { |
||||
394 | 6 | //$value = $value->jsonSerialize(); |
|||
395 | 6 | $export = 'new \stdClass()'; |
|||
396 | 6 | } elseif ($value instanceof \stdClass) { |
|||
397 | 6 | $export = '(object)' . PhpCode::varExport((array)$value); |
|||
398 | 6 | } elseif (is_string($value)) { |
|||
399 | 6 | switch ($key) { |
|||
400 | 6 | case 'pattern': |
|||
401 | $export = '"' . str_replace(array('\\', "\n", "\r", "\t", '"', '${', '{$'), array('\\\\', '\n', '\r', '\t', '\"', '\${', '{\$'), $value) . '"'; |
||||
402 | 2 | break; |
|||
403 | 2 | default: |
|||
404 | 2 | $export = '"' . str_replace(array('\\', "\n", "\r", "\t", '"', '$'), array('\\\\', '\n', '\r', '\t', '\"', '\$'), $value) . '"'; |
|||
405 | break; |
||||
406 | } |
||||
407 | |||||
408 | } else { |
||||
409 | $export = PhpCode::varExport($value); |
||||
410 | } |
||||
411 | |||||
412 | 11 | $key = PhpCode::makePhpName($key); |
|||
413 | $this->result->addSnippet( |
||||
414 | "{$this->varName}->{$key} = " . $export . ";\n" |
||||
415 | ); |
||||
416 | } |
||||
417 | } |
||||
418 | 11 | ||||
419 | /** |
||||
420 | 11 | * @throws Exception |
|||
421 | * @throws \Exception |
||||
422 | 11 | */ |
|||
423 | 8 | private function processLogic() |
|||
424 | { |
||||
425 | $names = Schema::names(); |
||||
426 | 11 | /** @var string $keyword */ |
|||
427 | 1 | foreach (array($names->not, $names->if, $names->then, $names->else) as $keyword) { |
|||
428 | if ($this->schema->$keyword !== null) { |
||||
429 | $schema = $this->schema->$keyword; |
||||
430 | 11 | $path = $this->path . '->' . $keyword; |
|||
0 ignored issues
–
show
Are you sure
$keyword of type Swaggest\JsonSchema\SchemaContract|string can be used in concatenation ?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
431 | 11 | if ($schema instanceof Schema) { |
|||
432 | 11 | $path = $this->pathFromDescription($path, $schema); |
|||
433 | 11 | if (!empty($schema->getFromRefs())) { |
|||
434 | 11 | $path = $schema->getFromRefs()[0]; |
|||
435 | 11 | } |
|||
436 | 11 | } |
|||
437 | $this->result->addSnippet( |
||||
438 | 11 | $this->copyTo(new SchemaBuilder( |
|||
439 | $schema, |
||||
440 | "{$this->varName}->{$keyword}", |
||||
441 | $path, |
||||
442 | 11 | $this->phpBuilder |
|||
443 | ))->build() |
||||
444 | 11 | ); |
|||
445 | 10 | } |
|||
446 | 3 | ||||
447 | 3 | } |
|||
448 | 3 | ||||
449 | foreach (array($names->anyOf, $names->oneOf, $names->allOf) as $keyword) { |
||||
450 | 10 | if ($this->schema->$keyword !== null) { |
|||
451 | foreach ($this->schema->$keyword as $index => $schema) { |
||||
452 | 1 | $path = $this->path . "->{$keyword}[{$index}]"; |
|||
453 | 1 | $path = $this->pathFromDescription($path, $schema); |
|||
454 | 1 | if ($schema instanceof Schema && !empty($schema->getFromRefs())) { |
|||
455 | 1 | $path = $schema->getFromRefs()[0]; |
|||
456 | } |
||||
457 | $varName = '$' . PhpCode::makePhpName("{$this->varName}->{$keyword}[{$index}]"); |
||||
458 | 1 | $schemaInit = $this->copyTo(new SchemaBuilder( |
|||
459 | $schema, |
||||
460 | $varName, |
||||
461 | $path, |
||||
462 | $this->phpBuilder |
||||
463 | ))->build(); |
||||
464 | 11 | ||||
465 | if (count($schemaInit->snippets) === 1) { // Init in single statement can be just assigned. |
||||
466 | 11 | $this->result->addSnippet($this->copyTo(new SchemaBuilder( |
|||
467 | 11 | $schema, |
|||
468 | "{$this->varName}->{$keyword}[{$index}]", |
||||
469 | $this->path . "->{$keyword}[{$index}]", |
||||
470 | $this->phpBuilder |
||||
471 | ))->build()); |
||||
472 | } else { |
||||
473 | $this->result->addSnippet($schemaInit); |
||||
474 | 4 | $this->result->addSnippet(<<<PHP |
|||
475 | {$this->varName}->{$keyword}[{$index}] = {$varName}; |
||||
476 | 4 | ||||
477 | 4 | PHP |
|||
478 | ); |
||||
479 | } |
||||
480 | } |
||||
481 | } |
||||
482 | } |
||||
483 | } |
||||
484 | |||||
485 | /** |
||||
486 | * @param string $path |
||||
487 | * @param Schema $schema |
||||
488 | * @return string |
||||
489 | */ |
||||
490 | private function pathFromDescription($path, $schema) |
||||
491 | { |
||||
492 | if ($this->phpBuilder->namesFromDescriptions) { |
||||
493 | if ($schema->title && strlen($schema->title) < 30) { |
||||
494 | $path = $this->path . "->{$schema->title}"; |
||||
495 | } elseif ($schema->description && strlen($schema->description) < 30) { |
||||
496 | $path = $this->path . "->{$schema->description}"; |
||||
497 | } |
||||
498 | } |
||||
499 | return $path; |
||||
500 | } |
||||
501 | |||||
502 | /** |
||||
503 | * @return PhpCode |
||||
504 | * @throws Exception |
||||
505 | * @throws \Swaggest\JsonSchema\InvalidValue |
||||
506 | */ |
||||
507 | public function build() |
||||
508 | { |
||||
509 | $this->result = new PhpCode(); |
||||
510 | |||||
511 | if ($this->processNamedClass()) { |
||||
512 | return $this->result; |
||||
513 | } |
||||
514 | |||||
515 | if ($this->processRef()) { |
||||
516 | return $this->result; |
||||
517 | } |
||||
518 | |||||
519 | $this->processType(); |
||||
520 | $this->processObject(); |
||||
521 | $this->processArray(); |
||||
522 | $this->processLogic(); |
||||
523 | $this->processEnum(); |
||||
524 | $this->processOther(); |
||||
525 | $this->processFromRef(); |
||||
526 | |||||
527 | return $this->result; |
||||
528 | |||||
529 | } |
||||
530 | |||||
531 | private function processFromRef() |
||||
532 | { |
||||
533 | if ($this->phpBuilder->minimizeRefs) { |
||||
534 | if ($fromRefs = $this->schema->getFromRefs()) { |
||||
535 | $fromRef = $fromRefs[count($fromRefs) - 1]; |
||||
536 | $value = var_export($fromRef, true); |
||||
537 | $this->result->addSnippet("{$this->varName}->setFromRef($value);\n"); |
||||
538 | } |
||||
539 | return; |
||||
540 | } |
||||
541 | if ($fromRefs = $this->schema->getFromRefs()) { |
||||
542 | foreach ($fromRefs as $fromRef) { |
||||
543 | $value = var_export($fromRef, true); |
||||
544 | $this->result->addSnippet("{$this->varName}->setFromRef($value);\n"); |
||||
545 | } |
||||
546 | } |
||||
547 | } |
||||
548 | |||||
549 | /** |
||||
550 | * @param boolean $skipProperties |
||||
551 | * @return $this |
||||
552 | */ |
||||
553 | public function setSkipProperties($skipProperties) |
||||
554 | { |
||||
555 | $this->skipProperties = $skipProperties; |
||||
556 | return $this; |
||||
557 | } |
||||
558 | |||||
559 | /** |
||||
560 | * @param PhpClass $saveEnumConstInClass |
||||
561 | * @return $this |
||||
562 | */ |
||||
563 | public function setSaveEnumConstInClass($saveEnumConstInClass) |
||||
564 | { |
||||
565 | $this->saveEnumConstInClass = $saveEnumConstInClass; |
||||
566 | return $this; |
||||
567 | } |
||||
568 | |||||
569 | |||||
570 | } |