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

api-platform / core / 15955912273

29 Jun 2025 01:51PM UTC coverage: 22.057% (-0.03%) from 22.082%
15955912273

Pull #7249

github

web-flow
Merge d9904d788 into a42034dc3
Pull Request #7249: chore: solve some phpstan issues

0 of 9 new or added lines in 8 files covered. (0.0%)

11540 existing lines in 372 files now uncovered.

11522 of 52237 relevant lines covered (22.06%)

11.08 hits per line

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

77.39
/src/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.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\DependencyInjection;
15

16
use ApiPlatform\Doctrine\Odm\Extension\AggregationCollectionExtensionInterface;
17
use ApiPlatform\Doctrine\Odm\Extension\AggregationItemExtensionInterface;
18
use ApiPlatform\Doctrine\Odm\Filter\AbstractFilter as DoctrineMongoDbOdmAbstractFilter;
19
use ApiPlatform\Doctrine\Odm\State\LinksHandlerInterface as OdmLinksHandlerInterface;
20
use ApiPlatform\Doctrine\Orm\Extension\EagerLoadingExtension;
21
use ApiPlatform\Doctrine\Orm\Extension\FilterEagerLoadingExtension;
22
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface as DoctrineQueryCollectionExtensionInterface;
23
use ApiPlatform\Doctrine\Orm\Extension\QueryItemExtensionInterface;
24
use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter as DoctrineOrmAbstractFilter;
25
use ApiPlatform\Doctrine\Orm\State\LinksHandlerInterface as OrmLinksHandlerInterface;
26
use ApiPlatform\Elasticsearch\Extension\RequestBodySearchCollectionExtensionInterface;
27
use ApiPlatform\GraphQl\Error\ErrorHandlerInterface;
28
use ApiPlatform\GraphQl\Executor;
29
use ApiPlatform\GraphQl\Resolver\MutationResolverInterface;
30
use ApiPlatform\GraphQl\Resolver\QueryCollectionResolverInterface;
31
use ApiPlatform\GraphQl\Resolver\QueryItemResolverInterface;
32
use ApiPlatform\GraphQl\Type\Definition\TypeInterface as GraphQlTypeInterface;
33
use ApiPlatform\Metadata\ApiResource;
34
use ApiPlatform\Metadata\FilterInterface;
35
use ApiPlatform\Metadata\UriVariableTransformerInterface;
36
use ApiPlatform\Metadata\UrlGeneratorInterface;
37
use ApiPlatform\OpenApi\Model\Tag;
38
use ApiPlatform\RamseyUuid\Serializer\UuidDenormalizer;
39
use ApiPlatform\State\ApiResource\Error;
40
use ApiPlatform\State\ParameterProviderInterface;
41
use ApiPlatform\State\ProcessorInterface;
42
use ApiPlatform\State\ProviderInterface;
43
use ApiPlatform\Symfony\Validator\Metadata\Property\Restriction\PropertySchemaRestrictionMetadataInterface;
44
use ApiPlatform\Symfony\Validator\ValidationGroupsGeneratorInterface;
45
use ApiPlatform\Validator\Exception\ValidationException;
46
use Doctrine\Persistence\ManagerRegistry;
47
use phpDocumentor\Reflection\DocBlockFactoryInterface;
48
use PHPStan\PhpDocParser\Parser\PhpDocParser;
49
use Ramsey\Uuid\Uuid;
50
use Symfony\Component\Config\FileLocator;
51
use Symfony\Component\Config\Resource\DirectoryResource;
52
use Symfony\Component\DependencyInjection\ChildDefinition;
53
use Symfony\Component\DependencyInjection\ContainerBuilder;
54
use Symfony\Component\DependencyInjection\Definition;
55
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
56
use Symfony\Component\DependencyInjection\Extension\Extension;
57
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
58
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
59
use Symfony\Component\DependencyInjection\Reference;
60
use Symfony\Component\Finder\Finder;
61
use Symfony\Component\HttpClient\ScopingHttpClient;
62
use Symfony\Component\ObjectMapper\ObjectMapper;
63
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
64
use Symfony\Component\Uid\AbstractUid;
65
use Symfony\Component\Validator\Validator\ValidatorInterface;
66
use Symfony\Component\Yaml\Yaml;
67
use Twig\Environment;
68

69
/**
70
 * The extension of this bundle.
71
 *
72
 * @author Kévin Dunglas <dunglas@gmail.com>
73
 */
74
final class ApiPlatformExtension extends Extension implements PrependExtensionInterface
75
{
76
    /**
77
     * {@inheritdoc}
78
     */
79
    public function prepend(ContainerBuilder $container): void
80
    {
UNCOV
81
        if (isset($container->getExtensions()['framework'])) {
1✔
UNCOV
82
            $container->prependExtensionConfig('framework', [
1✔
UNCOV
83
                'serializer' => [
1✔
UNCOV
84
                    'enabled' => true,
1✔
UNCOV
85
                ],
1✔
UNCOV
86
            ]);
1✔
UNCOV
87
            $container->prependExtensionConfig('framework', [
1✔
UNCOV
88
                'property_info' => [
1✔
UNCOV
89
                    'enabled' => true,
1✔
UNCOV
90
                ],
1✔
UNCOV
91
            ]);
1✔
92
        }
UNCOV
93
        if (isset($container->getExtensions()['lexik_jwt_authentication'])) {
1✔
94
            $container->prependExtensionConfig('lexik_jwt_authentication', [
×
95
                'api_platform' => [
×
96
                    'enabled' => true,
×
97
                ],
×
98
            ]);
×
99
        }
100
    }
101

102
    /**
103
     * {@inheritdoc}
104
     */
105
    public function load(array $configs, ContainerBuilder $container): void
106
    {
UNCOV
107
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
1✔
108

UNCOV
109
        $configuration = new Configuration();
1✔
UNCOV
110
        $config = $this->processConfiguration($configuration, $configs);
1✔
UNCOV
111
        $container->setParameter('api_platform.use_symfony_listeners', $config['use_symfony_listeners']);
1✔
112

UNCOV
113
        $formats = $this->getFormats($config['formats']);
1✔
UNCOV
114
        $patchFormats = $this->getFormats($config['patch_formats']);
1✔
UNCOV
115
        $errorFormats = $this->getFormats($config['error_formats']);
1✔
UNCOV
116
        $docsFormats = $this->getFormats($config['docs_formats']);
1✔
117

UNCOV
118
        if (!$config['enable_docs']) {
1✔
119
            // JSON-LD documentation format is mandatory, even if documentation is disabled.
120
            $docsFormats = isset($formats['jsonld']) ? ['jsonld' => ['application/ld+json']] : [];
×
121
            // If documentation is disabled, the Hydra documentation for all the resources is hidden by default.
122
            if (!isset($config['defaults']['hideHydraOperation']) && !isset($config['defaults']['hide_hydra_operation'])) {
×
123
                $config['defaults']['hideHydraOperation'] = true;
×
124
            }
125
        }
UNCOV
126
        $jsonSchemaFormats = $config['jsonschema_formats'];
1✔
127

UNCOV
128
        if (!$jsonSchemaFormats) {
1✔
UNCOV
129
            foreach (array_merge(array_keys($formats), array_keys($errorFormats)) as $f) {
1✔
130
                // Distinct JSON-based formats must have names that start with 'json'
UNCOV
131
                if (str_starts_with($f, 'json')) {
1✔
UNCOV
132
                    $jsonSchemaFormats[$f] = true;
1✔
133
                }
134
            }
135
        }
136

UNCOV
137
        if (!isset($errorFormats['json'])) {
1✔
UNCOV
138
            $errorFormats['json'] = ['application/problem+json', 'application/json'];
1✔
139
        }
140

UNCOV
141
        if (!isset($errorFormats['jsonproblem'])) {
1✔
142
            $errorFormats['jsonproblem'] = ['application/problem+json'];
×
143
        }
144

UNCOV
145
        if (isset($formats['jsonapi']) && !isset($patchFormats['jsonapi'])) {
1✔
UNCOV
146
            $patchFormats['jsonapi'] = ['application/vnd.api+json'];
1✔
147
        }
148

UNCOV
149
        $this->registerCommonConfiguration($container, $config, $loader, $formats, $patchFormats, $errorFormats, $docsFormats);
1✔
UNCOV
150
        $this->registerMetadataConfiguration($container, $config, $loader);
1✔
UNCOV
151
        $this->registerOAuthConfiguration($container, $config);
1✔
UNCOV
152
        $this->registerOpenApiConfiguration($container, $config, $loader);
1✔
UNCOV
153
        $this->registerSwaggerConfiguration($container, $config, $loader);
1✔
UNCOV
154
        $this->registerJsonApiConfiguration($formats, $loader, $config);
1✔
UNCOV
155
        $this->registerJsonLdHydraConfiguration($container, $formats, $loader, $config);
1✔
UNCOV
156
        $this->registerJsonHalConfiguration($formats, $loader);
1✔
UNCOV
157
        $this->registerJsonProblemConfiguration($errorFormats, $loader);
1✔
UNCOV
158
        $this->registerGraphQlConfiguration($container, $config, $loader);
1✔
UNCOV
159
        $this->registerCacheConfiguration($container);
1✔
UNCOV
160
        $this->registerDoctrineOrmConfiguration($container, $config, $loader);
1✔
UNCOV
161
        $this->registerDoctrineMongoDbOdmConfiguration($container, $config, $loader);
1✔
UNCOV
162
        $this->registerHttpCacheConfiguration($container, $config, $loader);
1✔
UNCOV
163
        $this->registerValidatorConfiguration($container, $config, $loader);
1✔
UNCOV
164
        $this->registerDataCollectorConfiguration($container, $config, $loader);
1✔
UNCOV
165
        $this->registerMercureConfiguration($container, $config, $loader);
1✔
UNCOV
166
        $this->registerMessengerConfiguration($container, $config, $loader);
1✔
UNCOV
167
        $this->registerElasticsearchConfiguration($container, $config, $loader);
1✔
UNCOV
168
        $this->registerSecurityConfiguration($container, $config, $loader);
1✔
UNCOV
169
        $this->registerMakerConfiguration($container, $config, $loader);
1✔
UNCOV
170
        $this->registerArgumentResolverConfiguration($loader);
1✔
UNCOV
171
        $this->registerLinkSecurityConfiguration($loader, $config);
1✔
172

UNCOV
173
        if (class_exists(ObjectMapper::class)) {
1✔
UNCOV
174
            $loader->load('state/object_mapper.xml');
1✔
175
        }
UNCOV
176
        $container->registerForAutoconfiguration(FilterInterface::class)
1✔
UNCOV
177
            ->addTag('api_platform.filter');
1✔
UNCOV
178
        $container->registerForAutoconfiguration(ProviderInterface::class)
1✔
UNCOV
179
            ->addTag('api_platform.state_provider');
1✔
UNCOV
180
        $container->registerForAutoconfiguration(ProcessorInterface::class)
1✔
UNCOV
181
            ->addTag('api_platform.state_processor');
1✔
UNCOV
182
        $container->registerForAutoconfiguration(UriVariableTransformerInterface::class)
1✔
UNCOV
183
            ->addTag('api_platform.uri_variables.transformer');
1✔
UNCOV
184
        $container->registerForAutoconfiguration(ParameterProviderInterface::class)
1✔
UNCOV
185
            ->addTag('api_platform.parameter_provider');
1✔
UNCOV
186
        $container->registerAttributeForAutoconfiguration(ApiResource::class, static function (ChildDefinition $definition): void {
1✔
187
            $definition->setAbstract(true)
×
188
                ->addTag('api_platform.resource')
×
189
                ->addTag('container.excluded', ['source' => 'by #[ApiResource] attribute']);
×
UNCOV
190
        });
1✔
191

UNCOV
192
        if (!$container->has('api_platform.state.item_provider')) {
1✔
193
            $container->setAlias('api_platform.state.item_provider', 'api_platform.state_provider.object');
×
194
        }
195
    }
196

197
    private function registerCommonConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader, array $formats, array $patchFormats, array $errorFormats, array $docsFormats): void
198
    {
UNCOV
199
        $loader->load('state/state.xml');
1✔
UNCOV
200
        $loader->load('symfony/symfony.xml');
1✔
UNCOV
201
        $loader->load('api.xml');
1✔
UNCOV
202
        $loader->load('filter.xml');
1✔
203

UNCOV
204
        if (class_exists(UuidDenormalizer::class) && class_exists(Uuid::class)) {
1✔
UNCOV
205
            $loader->load('ramsey_uuid.xml');
1✔
206
        }
207

UNCOV
208
        if (class_exists(AbstractUid::class)) {
1✔
UNCOV
209
            $loader->load('symfony/uid.xml');
1✔
210
        }
211

UNCOV
212
        $defaultContext = ['hydra_prefix' => $config['serializer']['hydra_prefix']] + ($container->hasParameter('serializer.default_context') ? $container->getParameter('serializer.default_context') : []);
1✔
213

UNCOV
214
        $container->setParameter('api_platform.serializer.default_context', $defaultContext);
1✔
UNCOV
215
        if (!$container->hasParameter('serializer.default_context')) {
1✔
UNCOV
216
            $container->setParameter('serializer.default_context', $container->getParameter('api_platform.serializer.default_context'));
1✔
217
        }
UNCOV
218
        if ($config['use_symfony_listeners']) {
1✔
219
            $loader->load('symfony/events.xml');
1✔
220
        } else {
UNCOV
221
            $loader->load('symfony/controller.xml');
×
UNCOV
222
            $loader->load('state/provider.xml');
×
UNCOV
223
            $loader->load('state/processor.xml');
×
224
        }
UNCOV
225
        $loader->load('state/parameter_provider.xml');
1✔
226

UNCOV
227
        $container->setParameter('api_platform.enable_entrypoint', $config['enable_entrypoint']);
1✔
UNCOV
228
        $container->setParameter('api_platform.enable_docs', $config['enable_docs']);
1✔
UNCOV
229
        $container->setParameter('api_platform.title', $config['title']);
1✔
UNCOV
230
        $container->setParameter('api_platform.description', $config['description']);
1✔
UNCOV
231
        $container->setParameter('api_platform.version', $config['version']);
1✔
UNCOV
232
        $container->setParameter('api_platform.show_webby', $config['show_webby']);
1✔
UNCOV
233
        $container->setParameter('api_platform.url_generation_strategy', $config['defaults']['url_generation_strategy'] ?? UrlGeneratorInterface::ABS_PATH);
1✔
UNCOV
234
        $container->setParameter('api_platform.exception_to_status', $config['exception_to_status']);
1✔
UNCOV
235
        $container->setParameter('api_platform.formats', $formats);
1✔
UNCOV
236
        $container->setParameter('api_platform.patch_formats', $patchFormats);
1✔
UNCOV
237
        $container->setParameter('api_platform.error_formats', $errorFormats);
1✔
UNCOV
238
        $container->setParameter('api_platform.docs_formats', $docsFormats);
1✔
UNCOV
239
        $container->setParameter('api_platform.jsonschema_formats', []);
1✔
UNCOV
240
        $container->setParameter('api_platform.eager_loading.enabled', $this->isConfigEnabled($container, $config['eager_loading']));
1✔
UNCOV
241
        $container->setParameter('api_platform.eager_loading.max_joins', $config['eager_loading']['max_joins']);
1✔
UNCOV
242
        $container->setParameter('api_platform.eager_loading.fetch_partial', $config['eager_loading']['fetch_partial']);
1✔
UNCOV
243
        $container->setParameter('api_platform.eager_loading.force_eager', $config['eager_loading']['force_eager']);
1✔
UNCOV
244
        $container->setParameter('api_platform.collection.exists_parameter_name', $config['collection']['exists_parameter_name']);
1✔
UNCOV
245
        $container->setParameter('api_platform.collection.order', $config['collection']['order']);
1✔
UNCOV
246
        $container->setParameter('api_platform.collection.order_parameter_name', $config['collection']['order_parameter_name']);
1✔
UNCOV
247
        $container->setParameter('api_platform.collection.order_nulls_comparison', $config['collection']['order_nulls_comparison']);
1✔
UNCOV
248
        $container->setParameter('api_platform.collection.pagination.enabled', $config['defaults']['pagination_enabled'] ?? true);
1✔
UNCOV
249
        $container->setParameter('api_platform.collection.pagination.partial', $config['defaults']['pagination_partial'] ?? false);
1✔
UNCOV
250
        $container->setParameter('api_platform.collection.pagination.client_enabled', $config['defaults']['pagination_client_enabled'] ?? false);
1✔
UNCOV
251
        $container->setParameter('api_platform.collection.pagination.client_items_per_page', $config['defaults']['pagination_client_items_per_page'] ?? false);
1✔
UNCOV
252
        $container->setParameter('api_platform.collection.pagination.client_partial', $config['defaults']['pagination_client_partial'] ?? false);
1✔
UNCOV
253
        $container->setParameter('api_platform.collection.pagination.items_per_page', $config['defaults']['pagination_items_per_page'] ?? 30);
1✔
UNCOV
254
        $container->setParameter('api_platform.collection.pagination.maximum_items_per_page', $config['defaults']['pagination_maximum_items_per_page'] ?? null);
1✔
UNCOV
255
        $container->setParameter('api_platform.collection.pagination.page_parameter_name', $config['defaults']['pagination_page_parameter_name'] ?? $config['collection']['pagination']['page_parameter_name']);
1✔
UNCOV
256
        $container->setParameter('api_platform.collection.pagination.enabled_parameter_name', $config['defaults']['pagination_enabled_parameter_name'] ?? $config['collection']['pagination']['enabled_parameter_name']);
1✔
UNCOV
257
        $container->setParameter('api_platform.collection.pagination.items_per_page_parameter_name', $config['defaults']['pagination_items_per_page_parameter_name'] ?? $config['collection']['pagination']['items_per_page_parameter_name']);
1✔
UNCOV
258
        $container->setParameter('api_platform.collection.pagination.partial_parameter_name', $config['defaults']['pagination_partial_parameter_name'] ?? $config['collection']['pagination']['partial_parameter_name']);
1✔
UNCOV
259
        $container->setParameter('api_platform.collection.pagination', $this->getPaginationDefaults($config['defaults'] ?? [], $config['collection']['pagination']));
1✔
UNCOV
260
        $container->setParameter('api_platform.handle_symfony_errors', $config['handle_symfony_errors'] ?? false);
1✔
UNCOV
261
        $container->setParameter('api_platform.http_cache.etag', $config['defaults']['cache_headers']['etag'] ?? true);
1✔
UNCOV
262
        $container->setParameter('api_platform.http_cache.max_age', $config['defaults']['cache_headers']['max_age'] ?? null);
1✔
UNCOV
263
        $container->setParameter('api_platform.http_cache.shared_max_age', $config['defaults']['cache_headers']['shared_max_age'] ?? null);
1✔
UNCOV
264
        $container->setParameter('api_platform.http_cache.vary', $config['defaults']['cache_headers']['vary'] ?? ['Accept']);
1✔
UNCOV
265
        $container->setParameter('api_platform.http_cache.public', $config['defaults']['cache_headers']['public'] ?? $config['http_cache']['public']);
1✔
UNCOV
266
        $container->setParameter('api_platform.http_cache.invalidation.max_header_length', $config['defaults']['cache_headers']['invalidation']['max_header_length'] ?? $config['http_cache']['invalidation']['max_header_length']);
1✔
UNCOV
267
        $container->setParameter('api_platform.http_cache.invalidation.xkey.glue', $config['defaults']['cache_headers']['invalidation']['xkey']['glue'] ?? $config['http_cache']['invalidation']['xkey']['glue']);
1✔
268

UNCOV
269
        $container->setAlias('api_platform.path_segment_name_generator', $config['path_segment_name_generator']);
1✔
UNCOV
270
        $container->setAlias('api_platform.inflector', $config['inflector']);
1✔
271

UNCOV
272
        if ($config['name_converter']) {
1✔
UNCOV
273
            $container->setAlias('api_platform.name_converter', $config['name_converter']);
1✔
274
        }
UNCOV
275
        $container->setParameter('api_platform.asset_package', $config['asset_package']);
1✔
UNCOV
276
        $container->setParameter('api_platform.defaults', $this->normalizeDefaults($config['defaults'] ?? []));
1✔
277

UNCOV
278
        if ($container->getParameter('kernel.debug')) {
1✔
UNCOV
279
            $container->removeDefinition('api_platform.serializer.mapping.cache_class_metadata_factory');
1✔
280
        }
281
    }
282

283
    /**
284
     * This method will be removed in 3.0 when "defaults" will be the regular configuration path for the pagination.
285
     */
286
    private function getPaginationDefaults(array $defaults, array $collectionPaginationConfiguration): array
287
    {
UNCOV
288
        $paginationOptions = [];
1✔
289

UNCOV
290
        foreach ($defaults as $key => $value) {
1✔
UNCOV
291
            if (!str_starts_with($key, 'pagination_')) {
1✔
UNCOV
292
                continue;
1✔
293
            }
294

UNCOV
295
            $paginationOptions[str_replace('pagination_', '', $key)] = $value;
1✔
296
        }
297

UNCOV
298
        return array_merge($collectionPaginationConfiguration, $paginationOptions);
1✔
299
    }
300

301
    private function normalizeDefaults(array $defaults): array
302
    {
UNCOV
303
        $normalizedDefaults = ['extra_properties' => $defaults['extra_properties'] ?? []];
1✔
UNCOV
304
        unset($defaults['extra_properties']);
1✔
305

UNCOV
306
        $rc = new \ReflectionClass(ApiResource::class);
1✔
UNCOV
307
        $publicProperties = [];
1✔
UNCOV
308
        foreach ($rc->getConstructor()->getParameters() as $param) {
1✔
UNCOV
309
            $publicProperties[$param->getName()] = true;
1✔
310
        }
311

UNCOV
312
        $nameConverter = new CamelCaseToSnakeCaseNameConverter();
1✔
UNCOV
313
        foreach ($defaults as $option => $value) {
1✔
UNCOV
314
            if (isset($publicProperties[$nameConverter->denormalize($option)])) {
1✔
UNCOV
315
                $normalizedDefaults[$option] = $value;
1✔
316

UNCOV
317
                continue;
1✔
318
            }
319

320
            $normalizedDefaults['extra_properties'][$option] = $value;
×
321
        }
322

UNCOV
323
        return $normalizedDefaults;
1✔
324
    }
325

326
    private function registerMetadataConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
327
    {
UNCOV
328
        [$xmlResources, $yamlResources, $phpResources] = $this->getResourcesToWatch($container, $config);
1✔
329

UNCOV
330
        $container->setParameter('api_platform.class_name_resources', $this->getClassNameResources());
1✔
331

UNCOV
332
        $loader->load('metadata/resource_name.xml');
1✔
UNCOV
333
        $loader->load('metadata/property_name.xml');
1✔
334

UNCOV
335
        if (!empty($config['resource_class_directories'])) {
1✔
336
            $container->setParameter('api_platform.resource_class_directories', array_merge(
×
337
                $config['resource_class_directories'],
×
338
                $container->getParameter('api_platform.resource_class_directories')
×
339
            ));
×
340
        }
341

342
        // V3 metadata
UNCOV
343
        $loader->load('metadata/php.xml');
1✔
UNCOV
344
        $loader->load('metadata/xml.xml');
1✔
UNCOV
345
        $loader->load('metadata/links.xml');
1✔
UNCOV
346
        $loader->load('metadata/property.xml');
1✔
UNCOV
347
        $loader->load('metadata/resource.xml');
1✔
UNCOV
348
        $loader->load('metadata/operation.xml');
1✔
349

UNCOV
350
        $container->getDefinition('api_platform.metadata.resource_extractor.xml')->replaceArgument(0, $xmlResources);
1✔
UNCOV
351
        $container->getDefinition('api_platform.metadata.property_extractor.xml')->replaceArgument(0, $xmlResources);
1✔
352

UNCOV
353
        if (class_exists(PhpDocParser::class) || interface_exists(DocBlockFactoryInterface::class)) {
1✔
UNCOV
354
            $loader->load('metadata/php_doc.xml');
1✔
355
        }
356

UNCOV
357
        if (class_exists(Yaml::class)) {
1✔
UNCOV
358
            $loader->load('metadata/yaml.xml');
1✔
UNCOV
359
            $container->getDefinition('api_platform.metadata.resource_extractor.yaml')->replaceArgument(0, $yamlResources);
1✔
UNCOV
360
            $container->getDefinition('api_platform.metadata.property_extractor.yaml')->replaceArgument(0, $yamlResources);
1✔
361
        }
362

UNCOV
363
        $container->getDefinition('api_platform.metadata.resource_extractor.php_file')->replaceArgument(0, $phpResources);
1✔
364
    }
365

366
    private function getClassNameResources(): array
367
    {
UNCOV
368
        return [
1✔
UNCOV
369
            Error::class,
1✔
UNCOV
370
            ValidationException::class,
1✔
UNCOV
371
        ];
1✔
372
    }
373

374
    private function getBundlesResourcesPaths(ContainerBuilder $container, array $config): array
375
    {
UNCOV
376
        $bundlesResourcesPaths = [];
1✔
377

UNCOV
378
        foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
1✔
UNCOV
379
            $dirname = $bundle['path'];
1✔
UNCOV
380
            $paths = [
1✔
UNCOV
381
                "$dirname/ApiResource",
1✔
UNCOV
382
                "$dirname/src/ApiResource",
1✔
UNCOV
383
            ];
1✔
UNCOV
384
            foreach (['.yaml', '.yml', '.xml', ''] as $extension) {
1✔
UNCOV
385
                $paths[] = "$dirname/Resources/config/api_resources$extension";
1✔
UNCOV
386
                $paths[] = "$dirname/config/api_resources$extension";
1✔
387
            }
UNCOV
388
            if ($this->isConfigEnabled($container, $config['doctrine'])) {
1✔
UNCOV
389
                $paths[] = "$dirname/Entity";
1✔
UNCOV
390
                $paths[] = "$dirname/src/Entity";
1✔
391
            }
UNCOV
392
            if ($this->isConfigEnabled($container, $config['doctrine_mongodb_odm'])) {
1✔
393
                $paths[] = "$dirname/Document";
×
394
                $paths[] = "$dirname/src/Document";
×
395
            }
396

UNCOV
397
            foreach ($paths as $path) {
1✔
UNCOV
398
                if ($container->fileExists($path, false)) {
1✔
UNCOV
399
                    $bundlesResourcesPaths[] = $path;
1✔
400
                }
401
            }
402
        }
403

UNCOV
404
        return $bundlesResourcesPaths;
1✔
405
    }
406

407
    private function getResourcesToWatch(ContainerBuilder $container, array $config): array
408
    {
UNCOV
409
        $paths = array_unique(array_merge($this->getBundlesResourcesPaths($container, $config), $config['mapping']['paths']));
1✔
410

UNCOV
411
        if (!$config['mapping']['paths']) {
1✔
412
            $projectDir = $container->getParameter('kernel.project_dir');
×
413
            foreach (["$projectDir/config/api_platform", "$projectDir/src/ApiResource"] as $dir) {
×
414
                if (is_dir($dir)) {
×
415
                    $paths[] = $dir;
×
416
                }
417
            }
418

419
            if ($this->isConfigEnabled($container, $config['doctrine']) && is_dir($doctrinePath = "$projectDir/src/Entity")) {
×
420
                $paths[] = $doctrinePath;
×
421
            }
422

423
            if ($this->isConfigEnabled($container, $config['doctrine_mongodb_odm']) && is_dir($documentPath = "$projectDir/src/Document")) {
×
424
                $paths[] = $documentPath;
×
425
            }
426
        }
427

UNCOV
428
        $resources = ['yml' => [], 'xml' => [], 'php' => [], 'dir' => []];
1✔
429

UNCOV
430
        foreach ($config['mapping']['imports'] ?? [] as $path) {
1✔
431
            if (is_dir($path)) {
×
432
                foreach (Finder::create()->followLinks()->files()->in($path)->name('/\.php$/')->sortByName() as $file) {
×
433
                    $resources[$file->getExtension()][] = $file->getRealPath();
×
434
                }
435

436
                $resources['dir'][] = $path;
×
437
                $container->addResource(new DirectoryResource($path, '/\.php$/'));
×
438

439
                continue;
×
440
            }
441

442
            if ($container->fileExists($path, false)) {
×
443
                if (!str_ends_with($path, '.php')) {
×
444
                    throw new RuntimeException(\sprintf('Unsupported mapping type in "%s", supported type is PHP.', $path));
×
445
                }
446

447
                $resources['php'][] = $path;
×
448

449
                continue;
×
450
            }
451

452
            throw new RuntimeException(\sprintf('Could not open file or directory "%s".', $path));
×
453
        }
454

UNCOV
455
        foreach ($paths as $path) {
1✔
UNCOV
456
            if (is_dir($path)) {
1✔
UNCOV
457
                foreach (Finder::create()->followLinks()->files()->in($path)->name('/\.(xml|ya?ml)$/')->sortByName() as $file) {
1✔
UNCOV
458
                    $resources['yaml' === ($extension = $file->getExtension()) ? 'yml' : $extension][] = $file->getRealPath();
1✔
459
                }
460

UNCOV
461
                $resources['dir'][] = $path;
1✔
UNCOV
462
                $container->addResource(new DirectoryResource($path, '/\.(xml|ya?ml|php)$/'));
1✔
463

UNCOV
464
                continue;
1✔
465
            }
466

467
            if ($container->fileExists($path, false)) {
×
468
                if (!preg_match('/\.(xml|ya?ml)$/', (string) $path, $matches)) {
×
469
                    throw new RuntimeException(\sprintf('Unsupported mapping type in "%s", supported types are XML & YAML.', $path));
×
470
                }
471

472
                $resources['yaml' === $matches[1] ? 'yml' : $matches[1]][] = $path;
×
473

474
                continue;
×
475
            }
476

477
            throw new RuntimeException(\sprintf('Could not open file or directory "%s".', $path));
×
478
        }
479

UNCOV
480
        $container->setParameter('api_platform.resource_class_directories', $resources['dir']);
1✔
481

UNCOV
482
        return [$resources['xml'], $resources['yml'], $resources['php']];
1✔
483
    }
484

485
    private function registerOAuthConfiguration(ContainerBuilder $container, array $config): void
486
    {
UNCOV
487
        if (!$config['oauth']) {
1✔
488
            return;
×
489
        }
490

UNCOV
491
        $container->setParameter('api_platform.oauth.enabled', $this->isConfigEnabled($container, $config['oauth']));
1✔
UNCOV
492
        $container->setParameter('api_platform.oauth.clientId', $config['oauth']['clientId']);
1✔
UNCOV
493
        $container->setParameter('api_platform.oauth.clientSecret', $config['oauth']['clientSecret']);
1✔
UNCOV
494
        $container->setParameter('api_platform.oauth.type', $config['oauth']['type']);
1✔
UNCOV
495
        $container->setParameter('api_platform.oauth.flow', $config['oauth']['flow']);
1✔
UNCOV
496
        $container->setParameter('api_platform.oauth.tokenUrl', $config['oauth']['tokenUrl']);
1✔
UNCOV
497
        $container->setParameter('api_platform.oauth.authorizationUrl', $config['oauth']['authorizationUrl']);
1✔
UNCOV
498
        $container->setParameter('api_platform.oauth.refreshUrl', $config['oauth']['refreshUrl']);
1✔
UNCOV
499
        $container->setParameter('api_platform.oauth.scopes', $config['oauth']['scopes']);
1✔
UNCOV
500
        $container->setParameter('api_platform.oauth.pkce', $config['oauth']['pkce']);
1✔
501
    }
502

503
    /**
504
     * Registers the Swagger, ReDoc and Swagger UI configuration.
505
     */
506
    private function registerSwaggerConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
507
    {
UNCOV
508
        foreach (array_keys($config['swagger']['api_keys']) as $keyName) {
1✔
UNCOV
509
            if (!preg_match('/^[a-zA-Z0-9._-]+$/', $keyName)) {
1✔
510
                trigger_deprecation('api-platform/core', '3.1', \sprintf('The swagger api_keys key "%s" is not valid with OpenAPI 3.1 it should match "^[a-zA-Z0-9._-]+$"', $keyName));
×
511
            }
512
        }
513

UNCOV
514
        $container->setParameter('api_platform.swagger.versions', $config['swagger']['versions']);
1✔
515

UNCOV
516
        if (!$config['enable_swagger'] && $config['enable_swagger_ui']) {
1✔
517
            throw new RuntimeException('You can not enable the Swagger UI without enabling Swagger, fix this by enabling swagger via the configuration "enable_swagger: true".');
×
518
        }
519

UNCOV
520
        if (!$config['enable_swagger']) {
1✔
521
            return;
×
522
        }
523

UNCOV
524
        $loader->load('openapi.xml');
1✔
525

UNCOV
526
        if (class_exists(Yaml::class)) {
1✔
UNCOV
527
            $loader->load('openapi/yaml.xml');
1✔
528
        }
529

UNCOV
530
        $loader->load('swagger_ui.xml');
1✔
531

UNCOV
532
        if ($config['use_symfony_listeners']) {
1✔
533
            $loader->load('symfony/swagger_ui.xml');
1✔
534
        }
535

UNCOV
536
        if ($config['enable_swagger_ui']) {
1✔
UNCOV
537
            $loader->load('state/swagger_ui.xml');
1✔
538
        }
539

UNCOV
540
        if (!$config['enable_swagger_ui'] && !$config['enable_re_doc']) {
1✔
541
            // Remove the listener but keep the controller to allow customizing the path of the UI
542
            $container->removeDefinition('api_platform.swagger.listener.ui');
×
543
        }
544

UNCOV
545
        $container->setParameter('api_platform.enable_swagger_ui', $config['enable_swagger_ui']);
1✔
UNCOV
546
        $container->setParameter('api_platform.enable_re_doc', $config['enable_re_doc']);
1✔
UNCOV
547
        $container->setParameter('api_platform.swagger.api_keys', $config['swagger']['api_keys']);
1✔
UNCOV
548
        $container->setParameter('api_platform.swagger.persist_authorization', $config['swagger']['persist_authorization']);
1✔
UNCOV
549
        $container->setParameter('api_platform.swagger.http_auth', $config['swagger']['http_auth']);
1✔
UNCOV
550
        if ($config['openapi']['swagger_ui_extra_configuration'] && $config['swagger']['swagger_ui_extra_configuration']) {
1✔
551
            throw new RuntimeException('You can not set "swagger_ui_extra_configuration" twice - in "openapi" and "swagger" section.');
×
552
        }
UNCOV
553
        $container->setParameter('api_platform.swagger_ui.extra_configuration', $config['openapi']['swagger_ui_extra_configuration'] ?: $config['swagger']['swagger_ui_extra_configuration']);
1✔
554
    }
555

556
    private function registerJsonApiConfiguration(array $formats, XmlFileLoader $loader, array $config): void
557
    {
UNCOV
558
        if (!isset($formats['jsonapi'])) {
1✔
559
            return;
×
560
        }
561

UNCOV
562
        $loader->load('jsonapi.xml');
1✔
UNCOV
563
        $loader->load('state/jsonapi.xml');
1✔
564
    }
565

566
    private function registerJsonLdHydraConfiguration(ContainerBuilder $container, array $formats, XmlFileLoader $loader, array $config): void
567
    {
UNCOV
568
        if (!isset($formats['jsonld'])) {
1✔
569
            return;
×
570
        }
571

UNCOV
572
        if ($config['use_symfony_listeners']) {
1✔
573
            $loader->load('symfony/jsonld.xml');
1✔
574
        } else {
UNCOV
575
            $loader->load('state/jsonld.xml');
×
576
        }
577

UNCOV
578
        $loader->load('state/hydra.xml');
1✔
UNCOV
579
        $loader->load('jsonld.xml');
1✔
UNCOV
580
        $loader->load('hydra.xml');
1✔
581

UNCOV
582
        if (!$container->has('api_platform.json_schema.schema_factory')) {
1✔
583
            $container->removeDefinition('api_platform.hydra.json_schema.schema_factory');
×
584
        }
585
    }
586

587
    private function registerJsonHalConfiguration(array $formats, XmlFileLoader $loader): void
588
    {
UNCOV
589
        if (!isset($formats['jsonhal'])) {
1✔
590
            return;
×
591
        }
592

UNCOV
593
        $loader->load('hal.xml');
1✔
594
    }
595

596
    private function registerJsonProblemConfiguration(array $errorFormats, XmlFileLoader $loader): void
597
    {
UNCOV
598
        if (!isset($errorFormats['jsonproblem'])) {
1✔
599
            return;
×
600
        }
601

UNCOV
602
        $loader->load('problem.xml');
1✔
603
    }
604

605
    private function registerGraphQlConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
606
    {
UNCOV
607
        $enabled = $this->isConfigEnabled($container, $config['graphql']);
1✔
UNCOV
608
        $graphqlIntrospectionEnabled = $enabled && $this->isConfigEnabled($container, $config['graphql']['introspection']);
1✔
UNCOV
609
        $graphiqlEnabled = $enabled && $this->isConfigEnabled($container, $config['graphql']['graphiql']);
1✔
UNCOV
610
        $graphqlPlayGroundEnabled = $enabled && $this->isConfigEnabled($container, $config['graphql']['graphql_playground']);
1✔
UNCOV
611
        $maxQueryDepth = (int) $config['graphql']['max_query_depth'];
1✔
UNCOV
612
        $maxQueryComplexity = (int) $config['graphql']['max_query_complexity'];
1✔
UNCOV
613
        if ($graphqlPlayGroundEnabled) {
1✔
614
            trigger_deprecation('api-platform/core', '3.1', 'GraphQL Playground is deprecated and will be removed in API Platform 4.0. Only GraphiQL will be available in the future. Set api_platform.graphql.graphql_playground to false in the configuration to remove this deprecation.');
×
615
        }
616

UNCOV
617
        $container->setParameter('api_platform.graphql.enabled', $enabled);
1✔
UNCOV
618
        $container->setParameter('api_platform.graphql.max_query_depth', $maxQueryDepth);
1✔
UNCOV
619
        $container->setParameter('api_platform.graphql.max_query_complexity', $maxQueryComplexity);
1✔
UNCOV
620
        $container->setParameter('api_platform.graphql.introspection.enabled', $graphqlIntrospectionEnabled);
1✔
UNCOV
621
        $container->setParameter('api_platform.graphql.graphiql.enabled', $graphiqlEnabled);
1✔
UNCOV
622
        $container->setParameter('api_platform.graphql.graphql_playground.enabled', $graphqlPlayGroundEnabled);
1✔
UNCOV
623
        $container->setParameter('api_platform.graphql.collection.pagination', $config['graphql']['collection']['pagination']);
1✔
624

UNCOV
625
        if (!$enabled) {
1✔
626
            return;
×
627
        }
628

UNCOV
629
        if (!class_exists(Executor::class)) {
1✔
630
            throw new \RuntimeException('Graphql is enabled but not installed, run: composer require "api-platform/graphql".');
×
631
        }
632

UNCOV
633
        $container->setParameter('api_platform.graphql.default_ide', $config['graphql']['default_ide']);
1✔
UNCOV
634
        $container->setParameter('api_platform.graphql.nesting_separator', $config['graphql']['nesting_separator']);
1✔
635

UNCOV
636
        $loader->load('graphql.xml');
1✔
637

638
        // @phpstan-ignore-next-line because PHPStan uses the container of the test env cache and in test the parameter kernel.bundles always contains the key TwigBundle
UNCOV
639
        if (!class_exists(Environment::class) || !isset($container->getParameter('kernel.bundles')['TwigBundle'])) {
1✔
640
            if ($graphiqlEnabled || $graphqlPlayGroundEnabled) {
×
641
                throw new RuntimeException(\sprintf('GraphiQL and GraphQL Playground interfaces depend on Twig. Please activate TwigBundle for the %s environnement or disable GraphiQL and GraphQL Playground.', $container->getParameter('kernel.environment')));
×
642
            }
643
            $container->removeDefinition('api_platform.graphql.action.graphiql');
×
644
            $container->removeDefinition('api_platform.graphql.action.graphql_playground');
×
645
        }
646

UNCOV
647
        $container->registerForAutoconfiguration(QueryItemResolverInterface::class)
1✔
UNCOV
648
            ->addTag('api_platform.graphql.resolver');
1✔
UNCOV
649
        $container->registerForAutoconfiguration(QueryCollectionResolverInterface::class)
1✔
UNCOV
650
            ->addTag('api_platform.graphql.resolver');
1✔
UNCOV
651
        $container->registerForAutoconfiguration(MutationResolverInterface::class)
1✔
UNCOV
652
            ->addTag('api_platform.graphql.resolver');
1✔
UNCOV
653
        $container->registerForAutoconfiguration(GraphQlTypeInterface::class)
1✔
UNCOV
654
            ->addTag('api_platform.graphql.type');
1✔
UNCOV
655
        $container->registerForAutoconfiguration(ErrorHandlerInterface::class)
1✔
UNCOV
656
            ->addTag('api_platform.graphql.error_handler');
1✔
657
    }
658

659
    private function registerCacheConfiguration(ContainerBuilder $container): void
660
    {
UNCOV
661
        if (!$container->hasParameter('kernel.debug') || !$container->getParameter('kernel.debug')) {
1✔
662
            $container->removeDefinition('api_platform.cache_warmer.cache_pool_clearer');
×
663
        }
664
    }
665

666
    private function registerDoctrineOrmConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
667
    {
UNCOV
668
        if (!$this->isConfigEnabled($container, $config['doctrine'])) {
1✔
669
            return;
×
670
        }
671

672
        // For older versions of doctrine bridge this allows autoconfiguration for filters
UNCOV
673
        if (!$container->has(ManagerRegistry::class)) {
1✔
UNCOV
674
            $container->setAlias(ManagerRegistry::class, 'doctrine');
1✔
675
        }
676

UNCOV
677
        $container->registerForAutoconfiguration(QueryItemExtensionInterface::class)
1✔
UNCOV
678
            ->addTag('api_platform.doctrine.orm.query_extension.item');
1✔
UNCOV
679
        $container->registerForAutoconfiguration(DoctrineQueryCollectionExtensionInterface::class)
1✔
UNCOV
680
            ->addTag('api_platform.doctrine.orm.query_extension.collection');
1✔
UNCOV
681
        $container->registerForAutoconfiguration(DoctrineOrmAbstractFilter::class);
1✔
682

UNCOV
683
        $container->registerForAutoconfiguration(OrmLinksHandlerInterface::class)
1✔
UNCOV
684
            ->addTag('api_platform.doctrine.orm.links_handler');
1✔
685

UNCOV
686
        $loader->load('doctrine_orm.xml');
1✔
687

UNCOV
688
        if ($this->isConfigEnabled($container, $config['eager_loading'])) {
1✔
UNCOV
689
            return;
1✔
690
        }
691

692
        $container->removeAlias(EagerLoadingExtension::class);
×
693
        $container->removeDefinition('api_platform.doctrine.orm.query_extension.eager_loading');
×
694
        $container->removeAlias(FilterEagerLoadingExtension::class);
×
695
        $container->removeDefinition('api_platform.doctrine.orm.query_extension.filter_eager_loading');
×
696
    }
697

698
    private function registerDoctrineMongoDbOdmConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
699
    {
UNCOV
700
        if (!$this->isConfigEnabled($container, $config['doctrine_mongodb_odm'])) {
1✔
UNCOV
701
            return;
1✔
702
        }
703

704
        $container->registerForAutoconfiguration(AggregationItemExtensionInterface::class)
×
705
            ->addTag('api_platform.doctrine_mongodb.odm.aggregation_extension.item');
×
706
        $container->registerForAutoconfiguration(AggregationCollectionExtensionInterface::class)
×
707
            ->addTag('api_platform.doctrine_mongodb.odm.aggregation_extension.collection');
×
708
        $container->registerForAutoconfiguration(DoctrineMongoDbOdmAbstractFilter::class)
×
709
            ->setBindings(['$managerRegistry' => new Reference('doctrine_mongodb')]);
×
710
        $container->registerForAutoconfiguration(OdmLinksHandlerInterface::class)
×
711
            ->addTag('api_platform.doctrine.odm.links_handler');
×
712

713
        $loader->load('doctrine_mongodb_odm.xml');
×
714
    }
715

716
    private function registerHttpCacheConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
717
    {
UNCOV
718
        $loader->load('http_cache.xml');
1✔
719

UNCOV
720
        if (!$this->isConfigEnabled($container, $config['http_cache']['invalidation'])) {
1✔
721
            return;
×
722
        }
723

UNCOV
724
        if ($this->isConfigEnabled($container, $config['doctrine'])) {
1✔
UNCOV
725
            $loader->load('doctrine_orm_http_cache_purger.xml');
1✔
726
        }
727

UNCOV
728
        $loader->load('state/http_cache_purger.xml');
1✔
UNCOV
729
        $loader->load('http_cache_purger.xml');
1✔
730

UNCOV
731
        foreach ($config['http_cache']['invalidation']['scoped_clients'] as $client) {
1✔
732
            $definition = $container->getDefinition($client);
×
733
            $definition->addTag('api_platform.http_cache.http_client');
×
734
        }
735

UNCOV
736
        if (!($urls = $config['http_cache']['invalidation']['urls'])) {
1✔
UNCOV
737
            $urls = $config['http_cache']['invalidation']['varnish_urls'];
1✔
738
        }
739

UNCOV
740
        foreach ($urls as $key => $url) {
1✔
741
            $definition = new Definition(ScopingHttpClient::class, [new Reference('http_client'), $url, ['base_uri' => $url] + $config['http_cache']['invalidation']['request_options']]);
×
742
            $definition->setFactory([ScopingHttpClient::class, 'forBaseUri']);
×
743
            $definition->addTag('api_platform.http_cache.http_client');
×
744
            $container->setDefinition('api_platform.invalidation_http_client.'.$key, $definition);
×
745
        }
746

UNCOV
747
        $serviceName = $config['http_cache']['invalidation']['purger'];
1✔
748

UNCOV
749
        if (!$container->hasDefinition('api_platform.http_cache.purger')) {
1✔
UNCOV
750
            $container->setAlias('api_platform.http_cache.purger', $serviceName);
1✔
751
        }
752
    }
753

754
    /**
755
     * Normalizes the format from config to the one accepted by Symfony HttpFoundation.
756
     */
757
    private function getFormats(array $configFormats): array
758
    {
UNCOV
759
        $formats = [];
1✔
UNCOV
760
        foreach ($configFormats as $format => $value) {
1✔
UNCOV
761
            foreach ($value['mime_types'] as $mimeType) {
1✔
UNCOV
762
                $formats[$format][] = $mimeType;
1✔
763
            }
764
        }
765

UNCOV
766
        return $formats;
1✔
767
    }
768

769
    private function registerValidatorConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
770
    {
UNCOV
771
        if (interface_exists(ValidatorInterface::class)) {
1✔
UNCOV
772
            $loader->load('metadata/validator.xml');
1✔
UNCOV
773
            $loader->load('validator/validator.xml');
1✔
774

UNCOV
775
            if ($this->isConfigEnabled($container, $config['graphql'])) {
1✔
UNCOV
776
                $loader->load('graphql/validator.xml');
1✔
777
            }
778

UNCOV
779
            $loader->load($config['use_symfony_listeners'] ? 'validator/events.xml' : 'validator/state.xml');
1✔
780

UNCOV
781
            $container->registerForAutoconfiguration(ValidationGroupsGeneratorInterface::class)
1✔
UNCOV
782
                ->addTag('api_platform.validation_groups_generator');
1✔
UNCOV
783
            $container->registerForAutoconfiguration(PropertySchemaRestrictionMetadataInterface::class)
1✔
UNCOV
784
                ->addTag('api_platform.metadata.property_schema_restriction');
1✔
785
        }
786

UNCOV
787
        if (!$config['validator']) {
1✔
788
            return;
×
789
        }
790

UNCOV
791
        $container->setParameter('api_platform.validator.serialize_payload_fields', $config['validator']['serialize_payload_fields']);
1✔
792
    }
793

794
    private function registerDataCollectorConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
795
    {
UNCOV
796
        if (!$config['enable_profiler']) {
1✔
797
            return;
×
798
        }
799

UNCOV
800
        $loader->load('data_collector.xml');
1✔
801

UNCOV
802
        if ($container->hasParameter('kernel.debug') && $container->getParameter('kernel.debug')) {
1✔
UNCOV
803
            $loader->load('debug.xml');
1✔
804
        }
805
    }
806

807
    private function registerMercureConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
808
    {
UNCOV
809
        if (!$this->isConfigEnabled($container, $config['mercure'])) {
1✔
810
            return;
×
811
        }
812

UNCOV
813
        $container->setParameter('api_platform.mercure.include_type', $config['mercure']['include_type']);
1✔
UNCOV
814
        $loader->load('state/mercure.xml');
1✔
815

UNCOV
816
        if ($this->isConfigEnabled($container, $config['doctrine'])) {
1✔
UNCOV
817
            $loader->load('doctrine_orm_mercure_publisher.xml');
1✔
818
        }
UNCOV
819
        if ($this->isConfigEnabled($container, $config['doctrine_mongodb_odm'])) {
1✔
820
            $loader->load('doctrine_odm_mercure_publisher.xml');
×
821
        }
822

UNCOV
823
        if ($this->isConfigEnabled($container, $config['graphql'])) {
1✔
UNCOV
824
            $loader->load('graphql_mercure.xml');
1✔
825
        }
826
    }
827

828
    private function registerMessengerConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
829
    {
UNCOV
830
        if (!$this->isConfigEnabled($container, $config['messenger'])) {
1✔
831
            return;
×
832
        }
833

UNCOV
834
        $loader->load('messenger.xml');
1✔
835
    }
836

837
    private function registerElasticsearchConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
838
    {
UNCOV
839
        $enabled = $this->isConfigEnabled($container, $config['elasticsearch']);
1✔
840

UNCOV
841
        $container->setParameter('api_platform.elasticsearch.enabled', $enabled);
1✔
842

UNCOV
843
        if (!$enabled) {
1✔
UNCOV
844
            return;
1✔
845
        }
846

847
        $clientClass = !class_exists(\Elasticsearch\Client::class)
×
848
            // ES v7
×
849
            ? \Elastic\Elasticsearch\Client::class
×
850
            // ES v8 and up
×
851
            : \Elasticsearch\Client::class;
×
852

853
        $clientDefinition = new Definition($clientClass);
×
854
        $container->setDefinition('api_platform.elasticsearch.client', $clientDefinition);
×
855
        $container->registerForAutoconfiguration(RequestBodySearchCollectionExtensionInterface::class)
×
856
            ->addTag('api_platform.elasticsearch.request_body_search_extension.collection');
×
857
        $container->setParameter('api_platform.elasticsearch.hosts', $config['elasticsearch']['hosts']);
×
858
        $loader->load('elasticsearch.xml');
×
859
    }
860

861
    private function registerSecurityConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
862
    {
863
        /** @var string[] $bundles */
UNCOV
864
        $bundles = $container->getParameter('kernel.bundles');
1✔
865

UNCOV
866
        if (!isset($bundles['SecurityBundle'])) {
1✔
867
            return;
×
868
        }
869

UNCOV
870
        $loader->load('security.xml');
1✔
871

UNCOV
872
        $loader->load('state/security.xml');
1✔
873

UNCOV
874
        if (interface_exists(ValidatorInterface::class)) {
1✔
UNCOV
875
            $loader->load('state/security_validator.xml');
1✔
876
        }
877

UNCOV
878
        if ($this->isConfigEnabled($container, $config['graphql'])) {
1✔
UNCOV
879
            $loader->load('graphql/security.xml');
1✔
880
        }
881
    }
882

883
    private function registerOpenApiConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
884
    {
UNCOV
885
        $container->setParameter('api_platform.openapi.termsOfService', $config['openapi']['termsOfService']);
1✔
UNCOV
886
        $container->setParameter('api_platform.openapi.contact.name', $config['openapi']['contact']['name']);
1✔
UNCOV
887
        $container->setParameter('api_platform.openapi.contact.url', $config['openapi']['contact']['url']);
1✔
UNCOV
888
        $container->setParameter('api_platform.openapi.contact.email', $config['openapi']['contact']['email']);
1✔
UNCOV
889
        $container->setParameter('api_platform.openapi.license.name', $config['openapi']['license']['name']);
1✔
UNCOV
890
        $container->setParameter('api_platform.openapi.license.url', $config['openapi']['license']['url']);
1✔
UNCOV
891
        $container->setParameter('api_platform.openapi.license.identifier', $config['openapi']['license']['identifier']);
1✔
UNCOV
892
        $container->setParameter('api_platform.openapi.overrideResponses', $config['openapi']['overrideResponses']);
1✔
893

UNCOV
894
        $tags = [];
1✔
UNCOV
895
        foreach ($config['openapi']['tags'] as $tag) {
1✔
896
            $tags[] = new Tag($tag['name'], $tag['description'] ?? null);
×
897
        }
898

UNCOV
899
        $container->setParameter('api_platform.openapi.tags', $tags);
1✔
900

UNCOV
901
        $container->setParameter('api_platform.openapi.errorResourceClass', $config['openapi']['error_resource_class'] ?? null);
1✔
UNCOV
902
        $container->setParameter('api_platform.openapi.validationErrorResourceClass', $config['openapi']['validation_error_resource_class'] ?? null);
1✔
903

UNCOV
904
        $loader->load('json_schema.xml');
1✔
905
    }
906

907
    private function registerMakerConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader): void
908
    {
UNCOV
909
        if (!$this->isConfigEnabled($container, $config['maker'])) {
1✔
910
            return;
×
911
        }
912

UNCOV
913
        $loader->load('maker.xml');
1✔
914
    }
915

916
    private function registerArgumentResolverConfiguration(XmlFileLoader $loader): void
917
    {
UNCOV
918
        $loader->load('argument_resolver.xml');
1✔
919
    }
920

921
    private function registerLinkSecurityConfiguration(XmlFileLoader $loader, array $config): void
922
    {
UNCOV
923
        if ($config['enable_link_security']) {
1✔
UNCOV
924
            $loader->load('link_security.xml');
1✔
925
        }
926
    }
927
}
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