• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

api-platform / core / 13200284839

07 Feb 2025 12:56PM UTC coverage: 0.0% (-8.2%) from 8.164%
13200284839

Pull #6952

github

web-flow
Merge 519fbf8cc into 62377f880
Pull Request #6952: fix: errors retrieval and documentation

0 of 206 new or added lines in 17 files covered. (0.0%)

10757 existing lines in 366 files now uncovered.

0 of 47781 relevant lines covered (0.0%)

0.0 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/Symfony/Bundle/DataCollector/RequestDataCollector.php
1
<?php
2

3
/*
4
 * This file is part of the API Platform project.
5
 *
6
 * (c) Kévin Dunglas <dunglas@gmail.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
declare(strict_types=1);
13

14
namespace ApiPlatform\Symfony\Bundle\DataCollector;
15

16
use ApiPlatform\Metadata\ApiResource;
17
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
18
use ApiPlatform\State\Util\RequestAttributesExtractor;
19
use Composer\InstalledVersions;
20
use PackageVersions\Versions;
21
use Psr\Container\ContainerInterface;
22
use Symfony\Component\HttpFoundation\Request;
23
use Symfony\Component\HttpFoundation\Response;
24
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
25
use Symfony\Component\VarDumper\Cloner\Data;
26

27
/**
28
 * @author Julien DENIAU <julien.deniau@gmail.com>
29
 * @author Anthony GRASSIOT <antograssiot@free.fr>
30
 */
31
final class RequestDataCollector extends DataCollector
32
{
33
    public function __construct(private readonly ResourceMetadataCollectionFactoryInterface $metadataFactory, private readonly ContainerInterface $filterLocator)
34
    {
UNCOV
35
    }
×
36

37
    /**
38
     * {@inheritdoc}
39
     */
40
    public function collect(Request $request, Response $response, ?\Throwable $exception = null): void
41
    {
UNCOV
42
        if ($request->attributes->get('_graphql', false)) {
×
43
            $resourceClasses = array_keys($request->attributes->get('_graphql_args', []));
×
44
        } else {
UNCOV
45
            $resourceClasses = array_filter([$request->attributes->get('_api_resource_class')]);
×
46
        }
47

UNCOV
48
        $requestAttributes = RequestAttributesExtractor::extractAttributes($request);
×
UNCOV
49
        if (isset($requestAttributes['previous_data'])) {
×
UNCOV
50
            $requestAttributes['previous_data'] = $this->cloneVar($requestAttributes['previous_data']);
×
51
        }
52

UNCOV
53
        $this->data['request_attributes'] = $requestAttributes;
×
UNCOV
54
        $this->data['acceptable_content_types'] = $request->getAcceptableContentTypes();
×
UNCOV
55
        $this->data['resources'] = array_map(fn (string $resourceClass): DataCollected => $this->collectDataByResource($resourceClass, $request), $resourceClasses);
×
56
    }
57

58
    private function setFilters(ApiResource $resourceMetadata, int $index, array &$filters, array &$counters): void
59
    {
UNCOV
60
        foreach ($resourceMetadata->getFilters() ?? [] as $id) {
×
UNCOV
61
            if ($this->filterLocator->has($id)) {
×
UNCOV
62
                $filters[$index][$id] = $this->filterLocator->get($id)::class;
×
UNCOV
63
                continue;
×
64
            }
65

UNCOV
66
            $filters[$index][$id] = null;
×
UNCOV
67
            ++$counters['ignored_filters'];
×
68
        }
69
    }
70

71
    // TODO: 4.1 remove Versions as its deprecated
72
    public function getVersion(): ?string
73
    {
UNCOV
74
        if (class_exists(InstalledVersions::class)) {
×
UNCOV
75
            return InstalledVersions::getPrettyVersion('api-platform/symfony') ?? InstalledVersions::getPrettyVersion('api-platform/core');
×
76
        }
77

78
        if (!class_exists(Versions::class)) {
×
79
            return null;
×
80
        }
81

82
        try {
83
            $version = strtok(Versions::getVersion('api-platform/symfony'), '@');
×
84
        } catch (\OutOfBoundsException) {
×
85
            $version = false;
×
86
        }
87

88
        if (false === $version) {
×
89
            try {
90
                $version = strtok(Versions::getVersion('api-platform/core'), '@');
×
91
            } catch (\OutOfBoundsException) {
×
92
                $version = false;
×
93
            }
94
        }
95

96
        if (false === $version) {
×
97
            return null;
×
98
        }
99

100
        preg_match('/^v(.*?)$/', $version, $output);
×
101

102
        return $output[1] ?? $version;
×
103
    }
104

105
    /**
106
     * {@inheritdoc}
107
     */
108
    public function getName(): string
109
    {
UNCOV
110
        return 'api_platform.data_collector.request';
×
111
    }
112

113
    public function getData(): array|Data
114
    {
115
        return $this->data;
×
116
    }
117

118
    public function getAcceptableContentTypes(): array
119
    {
UNCOV
120
        return $this->data['acceptable_content_types'] ?? [];
×
121
    }
122

123
    public function getRequestAttributes(): array
124
    {
UNCOV
125
        return $this->data['request_attributes'] ?? [];
×
126
    }
127

128
    public function getResources(): array
129
    {
UNCOV
130
        return $this->data['resources'] ?? [];
×
131
    }
132

133
    /**
134
     * {@inheritdoc}
135
     */
136
    public function reset(): void
137
    {
UNCOV
138
        $this->data = [];
×
139
    }
140

141
    private function collectDataByResource(string $resourceClass, Request $request): DataCollected
142
    {
UNCOV
143
        $resourceMetadataCollection = $resourceClass ? $this->metadataFactory->create($resourceClass) : [];
×
UNCOV
144
        $filters = [];
×
UNCOV
145
        $counters = ['ignored_filters' => 0];
×
UNCOV
146
        $resourceMetadataCollectionData = [];
×
147

148
        /** @var ApiResource $resourceMetadata */
UNCOV
149
        foreach ($resourceMetadataCollection as $index => $resourceMetadata) {
×
UNCOV
150
            $this->setFilters($resourceMetadata, $index, $filters, $counters);
×
UNCOV
151
            $resourceMetadataCollectionData[] = [
×
UNCOV
152
                'resource' => $resourceMetadata,
×
UNCOV
153
                'operations' => null !== $resourceMetadata->getOperations() ? iterator_to_array($resourceMetadata->getOperations()) : [],
×
UNCOV
154
            ];
×
155
        }
156

UNCOV
157
        return new DataCollected(
×
UNCOV
158
            $resourceClass,
×
UNCOV
159
            $this->cloneVar($resourceMetadataCollectionData),
×
UNCOV
160
            $filters,
×
UNCOV
161
            $counters
×
UNCOV
162
        );
×
163
    }
164
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc