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

api-platform / core / 10014117656

19 Jul 2024 08:44PM UTC coverage: 7.856% (-56.3%) from 64.185%
10014117656

push

github

soyuka
Merge branch 'sf/remove-flag'

0 of 527 new or added lines in 83 files covered. (0.0%)

10505 existing lines in 362 files now uncovered.

12705 of 161727 relevant lines covered (7.86%)

26.85 hits per line

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

88.37
/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 PackageVersions\Versions;
20
use Psr\Container\ContainerInterface;
21
use Symfony\Component\HttpFoundation\Request;
22
use Symfony\Component\HttpFoundation\Response;
23
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
24
use Symfony\Component\VarDumper\Cloner\Data;
25

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

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

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

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

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

UNCOV
65
            $filters[$index][$id] = null;
12✔
UNCOV
66
            ++$counters['ignored_filters'];
12✔
67
        }
68
    }
69

70
    public function getVersion(): ?string
71
    {
UNCOV
72
        if (!class_exists(Versions::class)) {
9✔
UNCOV
73
            return null;
9✔
74
        }
75

76
        $version = Versions::getVersion('api-platform/core');
×
77
        preg_match('/^v(.*?)@/', (string) $version, $output);
×
78

79
        return $output[1] ?? strtok($version, '@');
×
80
    }
81

82
    /**
83
     * {@inheritdoc}
84
     */
85
    public function getName(): string
86
    {
UNCOV
87
        return 'api_platform.data_collector.request';
2,660✔
88
    }
89

90
    public function getData(): array|Data
91
    {
92
        return $this->data;
×
93
    }
94

95
    public function getAcceptableContentTypes(): array
96
    {
UNCOV
97
        return $this->data['acceptable_content_types'] ?? [];
9✔
98
    }
99

100
    public function getRequestAttributes(): array
101
    {
UNCOV
102
        return $this->data['request_attributes'] ?? [];
12✔
103
    }
104

105
    public function getResources(): array
106
    {
UNCOV
107
        return $this->data['resources'] ?? [];
21✔
108
    }
109

110
    /**
111
     * {@inheritdoc}
112
     */
113
    public function reset(): void
114
    {
UNCOV
115
        $this->data = [];
542✔
116
    }
117

118
    private function collectDataByResource(string $resourceClass, Request $request): DataCollected
119
    {
UNCOV
120
        $resourceMetadataCollection = $resourceClass ? $this->metadataFactory->create($resourceClass) : [];
18✔
UNCOV
121
        $filters = [];
18✔
UNCOV
122
        $counters = ['ignored_filters' => 0];
18✔
UNCOV
123
        $resourceMetadataCollectionData = [];
18✔
124

125
        /** @var ApiResource $resourceMetadata */
UNCOV
126
        foreach ($resourceMetadataCollection as $index => $resourceMetadata) {
18✔
UNCOV
127
            $this->setFilters($resourceMetadata, $index, $filters, $counters);
18✔
UNCOV
128
            $resourceMetadataCollectionData[] = [
18✔
UNCOV
129
                'resource' => $resourceMetadata,
18✔
UNCOV
130
                'operations' => null !== $resourceMetadata->getOperations() ? iterator_to_array($resourceMetadata->getOperations()) : [],
18✔
UNCOV
131
            ];
18✔
132
        }
133

UNCOV
134
        return new DataCollected(
18✔
UNCOV
135
            $resourceClass,
18✔
UNCOV
136
            $this->cloneVar($resourceMetadataCollectionData),
18✔
UNCOV
137
            $filters,
18✔
UNCOV
138
            $counters
18✔
UNCOV
139
        );
18✔
140
    }
141
}
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

© 2026 Coveralls, Inc