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

api-platform / core / 16050929464

03 Jul 2025 12:51PM UTC coverage: 22.065% (+0.2%) from 21.821%
16050929464

push

github

soyuka
chore: todo improvement

11516 of 52192 relevant lines covered (22.06%)

22.08 hits per line

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

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

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

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

46
        $this->data['operation_name'] = $request->attributes->get('_api_operation_name');
16✔
47
        $this->data['acceptable_content_types'] = $request->getAcceptableContentTypes();
16✔
48
        $this->data['resources'] = array_map(fn (string $resourceClass): DataCollected => $this->collectDataByResource($resourceClass), $resourceClasses);
16✔
49

50
        $parameters = [];
16✔
51
        if ($operation = $request->attributes->get('_api_operation')) {
16✔
52
            foreach ($operation->getParameters() ?? [] as $key => $param) {
16✔
53
                $parameters[$key] = $this->cloneVar($param);
4✔
54
            }
55
        }
56

57
        $this->data['parameters'] = $parameters;
16✔
58
    }
59

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

68
            $filters[$index][$id] = null;
4✔
69
            ++$counters['ignored_filters'];
4✔
70
        }
71
    }
72

73
    /**
74
     * {@inheritdoc}
75
     */
76
    public function getName(): string
77
    {
78
        return 'api_platform.data_collector.request';
544✔
79
    }
80

81
    public function getData(): array|Data
82
    {
83
        return $this->data;
×
84
    }
85

86
    public function getAcceptableContentTypes(): array
87
    {
88
        return $this->data['acceptable_content_types'] ?? [];
6✔
89
    }
90

91
    public function getOperationName(): ?string
92
    {
93
        return $this->data['operation_name'] ?? null;
2✔
94
    }
95

96
    public function getParameters(): array
97
    {
98
        return $this->data['parameters'] ?? [];
2✔
99
    }
100

101
    public function getResources(): array
102
    {
103
        return $this->data['resources'] ?? [];
14✔
104
    }
105

106
    /**
107
     * {@inheritdoc}
108
     */
109
    public function reset(): void
110
    {
111
        $this->data = [];
544✔
112
    }
113

114
    private function collectDataByResource(string $resourceClass): DataCollected
115
    {
116
        $resourceMetadataCollection = $resourceClass ? $this->metadataFactory->create($resourceClass) : [];
8✔
117
        $filters = [];
8✔
118
        $counters = ['ignored_filters' => 0];
8✔
119
        $resourceMetadataCollectionData = [];
8✔
120

121
        /** @var ApiResource $resourceMetadata */
122
        foreach ($resourceMetadataCollection as $index => $resourceMetadata) {
8✔
123
            $this->setFilters($resourceMetadata, $index, $filters, $counters);
8✔
124
            $resourceMetadataCollectionData[] = [
8✔
125
                'resource' => $resourceMetadata,
8✔
126
                'operations' => null !== $resourceMetadata->getOperations() ? iterator_to_array($resourceMetadata->getOperations()) : [],
8✔
127
            ];
8✔
128
        }
129

130
        return new DataCollected(
8✔
131
            $resourceClass,
8✔
132
            $this->cloneVar($resourceMetadataCollectionData),
8✔
133
            $filters,
8✔
134
            $counters
8✔
135
        );
8✔
136
    }
137
}
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