-
-
Notifications
You must be signed in to change notification settings - Fork 970
Expand file tree
/
Copy pathOpenApiNormalizer.php
More file actions
99 lines (82 loc) · 2.75 KB
/
Copy pathOpenApiNormalizer.php
File metadata and controls
99 lines (82 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace ApiPlatform\Core\OpenApi\Serializer;
use ApiPlatform\Core\OpenApi\OpenApi;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\CacheableSupportsMethodInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
/**
* Generates an OpenAPI v3 specification.
*/
final class OpenApiNormalizer implements NormalizerInterface, CacheableSupportsMethodInterface
{
public const FORMAT = 'json';
private const EXTENSION_PROPERTIES_KEY = 'extensionProperties';
private $decorated;
public function __construct(NormalizerInterface $decorated)
{
$this->decorated = $decorated;
}
/**
* {@inheritdoc}
*/
public function normalize($object, $format = null, array $context = []): array
{
$context[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] = true;
$context[AbstractObjectNormalizer::SKIP_NULL_VALUES] = true;
return $this->recursiveClean($this->decorated->normalize($object, $format, $context));
}
private function recursiveClean($data): array
{
foreach ($data as $key => $value) {
if (self::EXTENSION_PROPERTIES_KEY === $key) {
foreach ($data[self::EXTENSION_PROPERTIES_KEY] as $extensionPropertyKey => $extensionPropertyValue) {
$data[$extensionPropertyKey] = $extensionPropertyValue;
}
continue;
}
if ('schemas' === $key) {
if ($value) {
ksort($value);
}
}
// Side effect of using getPaths(): Paths which itself contains the array
if ('paths' === $key) {
$value = $data['paths'] = $data['paths']['paths'];
if ($value) {
ksort($value);
}
unset($data['paths']['paths']);
}
if (\is_array($value)) {
$data[$key] = $this->recursiveClean($value);
// arrays must stay even if empty
continue;
}
}
unset($data[self::EXTENSION_PROPERTIES_KEY]);
return $data;
}
/**
* {@inheritdoc}
*/
public function supportsNormalization($data, $format = null): bool
{
return self::FORMAT === $format && $data instanceof OpenApi;
}
/**
* {@inheritdoc}
*/
public function hasCacheableSupportsMethod(): bool
{
return true;
}
}