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

api-platform / core / 13202629907

07 Feb 2025 03:13PM UTC coverage: 7.554% (+0.3%) from 7.283%
13202629907

Pull #6954

github

web-flow
Merge 696625eca into 89816721e
Pull Request #6954: perf: various optimizations for Laravel/Symfony

10 of 18 new or added lines in 4 files covered. (55.56%)

94 existing lines in 8 files now uncovered.

9931 of 131474 relevant lines covered (7.55%)

4.44 hits per line

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

0.0
/src/Laravel/ApiPlatformProvider.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\Laravel;
15

16
use ApiPlatform\GraphQl\Error\ErrorHandler as GraphQlErrorHandler;
17
use ApiPlatform\GraphQl\Error\ErrorHandlerInterface;
18
use ApiPlatform\GraphQl\Executor;
19
use ApiPlatform\GraphQl\ExecutorInterface;
20
use ApiPlatform\GraphQl\Resolver\Factory\ResolverFactory;
21
use ApiPlatform\GraphQl\Resolver\Factory\ResolverFactoryInterface;
22
use ApiPlatform\GraphQl\Resolver\QueryCollectionResolverInterface;
23
use ApiPlatform\GraphQl\Resolver\QueryItemResolverInterface;
24
use ApiPlatform\GraphQl\Resolver\ResourceFieldResolver;
25
use ApiPlatform\GraphQl\Serializer\Exception\ErrorNormalizer as GraphQlErrorNormalizer;
26
use ApiPlatform\GraphQl\Serializer\Exception\HttpExceptionNormalizer as GraphQlHttpExceptionNormalizer;
27
use ApiPlatform\GraphQl\Serializer\Exception\RuntimeExceptionNormalizer as GraphQlRuntimeExceptionNormalizer;
28
use ApiPlatform\GraphQl\Serializer\Exception\ValidationExceptionNormalizer as GraphQlValidationExceptionNormalizer;
29
use ApiPlatform\GraphQl\Serializer\ItemNormalizer as GraphQlItemNormalizer;
30
use ApiPlatform\GraphQl\Serializer\ObjectNormalizer as GraphQlObjectNormalizer;
31
use ApiPlatform\GraphQl\Serializer\SerializerContextBuilder as GraphQlSerializerContextBuilder;
32
use ApiPlatform\GraphQl\State\Processor\NormalizeProcessor;
33
use ApiPlatform\GraphQl\State\Provider\DenormalizeProvider as GraphQlDenormalizeProvider;
34
use ApiPlatform\GraphQl\State\Provider\ReadProvider as GraphQlReadProvider;
35
use ApiPlatform\GraphQl\State\Provider\ResolverProvider;
36
use ApiPlatform\GraphQl\Type\ContextAwareTypeBuilderInterface;
37
use ApiPlatform\GraphQl\Type\FieldsBuilder;
38
use ApiPlatform\GraphQl\Type\FieldsBuilderEnumInterface;
39
use ApiPlatform\GraphQl\Type\SchemaBuilder;
40
use ApiPlatform\GraphQl\Type\SchemaBuilderInterface;
41
use ApiPlatform\GraphQl\Type\TypeBuilder;
42
use ApiPlatform\GraphQl\Type\TypeConverter;
43
use ApiPlatform\GraphQl\Type\TypeConverterInterface;
44
use ApiPlatform\GraphQl\Type\TypesContainer;
45
use ApiPlatform\GraphQl\Type\TypesContainerInterface;
46
use ApiPlatform\GraphQl\Type\TypesFactory;
47
use ApiPlatform\GraphQl\Type\TypesFactoryInterface;
48
use ApiPlatform\Hal\Serializer\CollectionNormalizer as HalCollectionNormalizer;
49
use ApiPlatform\Hal\Serializer\EntrypointNormalizer as HalEntrypointNormalizer;
50
use ApiPlatform\Hal\Serializer\ItemNormalizer as HalItemNormalizer;
51
use ApiPlatform\Hal\Serializer\ObjectNormalizer as HalObjectNormalizer;
52
use ApiPlatform\Hydra\JsonSchema\SchemaFactory as HydraSchemaFactory;
53
use ApiPlatform\Hydra\Serializer\CollectionFiltersNormalizer as HydraCollectionFiltersNormalizer;
54
use ApiPlatform\Hydra\Serializer\CollectionNormalizer as HydraCollectionNormalizer;
55
use ApiPlatform\Hydra\Serializer\DocumentationNormalizer as HydraDocumentationNormalizer;
56
use ApiPlatform\Hydra\Serializer\EntrypointNormalizer as HydraEntrypointNormalizer;
57
use ApiPlatform\Hydra\Serializer\HydraPrefixNameConverter;
58
use ApiPlatform\Hydra\Serializer\PartialCollectionViewNormalizer as HydraPartialCollectionViewNormalizer;
59
use ApiPlatform\Hydra\State\HydraLinkProcessor;
60
use ApiPlatform\JsonApi\Filter\SparseFieldset;
61
use ApiPlatform\JsonApi\Filter\SparseFieldsetParameterProvider;
62
use ApiPlatform\JsonApi\JsonSchema\SchemaFactory as JsonApiSchemaFactory;
63
use ApiPlatform\JsonApi\Serializer\CollectionNormalizer as JsonApiCollectionNormalizer;
64
use ApiPlatform\JsonApi\Serializer\EntrypointNormalizer as JsonApiEntrypointNormalizer;
65
use ApiPlatform\JsonApi\Serializer\ErrorNormalizer as JsonApiErrorNormalizer;
66
use ApiPlatform\JsonApi\Serializer\ItemNormalizer as JsonApiItemNormalizer;
67
use ApiPlatform\JsonApi\Serializer\ObjectNormalizer as JsonApiObjectNormalizer;
68
use ApiPlatform\JsonApi\Serializer\ReservedAttributeNameConverter;
69
use ApiPlatform\JsonLd\AnonymousContextBuilderInterface;
70
use ApiPlatform\JsonLd\ContextBuilder as JsonLdContextBuilder;
71
use ApiPlatform\JsonLd\ContextBuilderInterface;
72
use ApiPlatform\JsonLd\Serializer\ItemNormalizer as JsonLdItemNormalizer;
73
use ApiPlatform\JsonLd\Serializer\ObjectNormalizer as JsonLdObjectNormalizer;
74
use ApiPlatform\JsonSchema\DefinitionNameFactory;
75
use ApiPlatform\JsonSchema\DefinitionNameFactoryInterface;
76
use ApiPlatform\JsonSchema\Metadata\Property\Factory\SchemaPropertyMetadataFactory;
77
use ApiPlatform\JsonSchema\SchemaFactory;
78
use ApiPlatform\JsonSchema\SchemaFactoryInterface;
79
use ApiPlatform\Laravel\ApiResource\Error;
80
use ApiPlatform\Laravel\Controller\ApiPlatformController;
81
use ApiPlatform\Laravel\Controller\DocumentationController;
82
use ApiPlatform\Laravel\Controller\EntrypointController;
83
use ApiPlatform\Laravel\Eloquent\Extension\FilterQueryExtension;
84
use ApiPlatform\Laravel\Eloquent\Extension\QueryExtensionInterface;
85
use ApiPlatform\Laravel\Eloquent\Filter\DateFilter;
86
use ApiPlatform\Laravel\Eloquent\Filter\EqualsFilter;
87
use ApiPlatform\Laravel\Eloquent\Filter\FilterInterface as EloquentFilterInterface;
88
use ApiPlatform\Laravel\Eloquent\Filter\JsonApi\SortFilter;
89
use ApiPlatform\Laravel\Eloquent\Filter\JsonApi\SortFilterParameterProvider;
90
use ApiPlatform\Laravel\Eloquent\Filter\OrderFilter;
91
use ApiPlatform\Laravel\Eloquent\Filter\PartialSearchFilter;
92
use ApiPlatform\Laravel\Eloquent\Filter\RangeFilter;
93
use ApiPlatform\Laravel\Eloquent\Metadata\Factory\Property\EloquentAttributePropertyMetadataFactory;
94
use ApiPlatform\Laravel\Eloquent\Metadata\Factory\Property\EloquentPropertyMetadataFactory;
95
use ApiPlatform\Laravel\Eloquent\Metadata\Factory\Property\EloquentPropertyNameCollectionMetadataFactory;
96
use ApiPlatform\Laravel\Eloquent\Metadata\Factory\Resource\EloquentResourceCollectionMetadataFactory;
97
use ApiPlatform\Laravel\Eloquent\Metadata\IdentifiersExtractor as EloquentIdentifiersExtractor;
98
use ApiPlatform\Laravel\Eloquent\Metadata\ModelMetadata;
99
use ApiPlatform\Laravel\Eloquent\Metadata\ResourceClassResolver as EloquentResourceClassResolver;
100
use ApiPlatform\Laravel\Eloquent\PropertyAccess\PropertyAccessor as EloquentPropertyAccessor;
101
use ApiPlatform\Laravel\Eloquent\Serializer\SerializerContextBuilder as EloquentSerializerContextBuilder;
102
use ApiPlatform\Laravel\Eloquent\Serializer\SnakeCaseToCamelCaseNameConverter;
103
use ApiPlatform\Laravel\Eloquent\State\CollectionProvider;
104
use ApiPlatform\Laravel\Eloquent\State\ItemProvider;
105
use ApiPlatform\Laravel\Eloquent\State\LinksHandler;
106
use ApiPlatform\Laravel\Eloquent\State\LinksHandlerInterface;
107
use ApiPlatform\Laravel\Eloquent\State\PersistProcessor;
108
use ApiPlatform\Laravel\Eloquent\State\RemoveProcessor;
109
use ApiPlatform\Laravel\Exception\ErrorHandler;
110
use ApiPlatform\Laravel\GraphQl\Controller\EntrypointController as GraphQlEntrypointController;
111
use ApiPlatform\Laravel\GraphQl\Controller\GraphiQlController;
112
use ApiPlatform\Laravel\JsonApi\State\JsonApiProvider;
113
use ApiPlatform\Laravel\Metadata\CachePropertyMetadataFactory;
114
use ApiPlatform\Laravel\Metadata\CachePropertyNameCollectionMetadataFactory;
115
use ApiPlatform\Laravel\Metadata\CacheResourceCollectionMetadataFactory;
116
use ApiPlatform\Laravel\Metadata\ParameterValidationResourceMetadataCollectionFactory;
117
use ApiPlatform\Laravel\Routing\IriConverter;
118
use ApiPlatform\Laravel\Routing\Router as UrlGeneratorRouter;
119
use ApiPlatform\Laravel\Routing\SkolemIriConverter;
120
use ApiPlatform\Laravel\Security\ResourceAccessChecker;
121
use ApiPlatform\Laravel\State\AccessCheckerProvider;
122
use ApiPlatform\Laravel\State\ParameterValidatorProvider;
123
use ApiPlatform\Laravel\State\SwaggerUiProcessor;
124
use ApiPlatform\Laravel\State\SwaggerUiProvider;
125
use ApiPlatform\Laravel\State\ValidateProvider;
126
use ApiPlatform\Metadata\IdentifiersExtractor;
127
use ApiPlatform\Metadata\IdentifiersExtractorInterface;
128
use ApiPlatform\Metadata\InflectorInterface;
129
use ApiPlatform\Metadata\IriConverterInterface;
130
use ApiPlatform\Metadata\Operation\Factory\OperationMetadataFactory;
131
use ApiPlatform\Metadata\Operation\Factory\OperationMetadataFactoryInterface;
132
use ApiPlatform\Metadata\Operation\PathSegmentNameGeneratorInterface;
133
use ApiPlatform\Metadata\Operation\UnderscorePathSegmentNameGenerator;
134
use ApiPlatform\Metadata\Property\Factory\AttributePropertyMetadataFactory;
135
use ApiPlatform\Metadata\Property\Factory\ClassLevelAttributePropertyNameCollectionFactory;
136
use ApiPlatform\Metadata\Property\Factory\ConcernsPropertyNameCollectionMetadataFactory;
137
use ApiPlatform\Metadata\Property\Factory\PropertyInfoPropertyMetadataFactory;
138
use ApiPlatform\Metadata\Property\Factory\PropertyInfoPropertyNameCollectionFactory;
139
use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
140
use ApiPlatform\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface;
141
use ApiPlatform\Metadata\Property\Factory\SerializerPropertyMetadataFactory;
142
use ApiPlatform\Metadata\Resource\Factory\AlternateUriResourceMetadataCollectionFactory;
143
use ApiPlatform\Metadata\Resource\Factory\AttributesResourceMetadataCollectionFactory;
144
use ApiPlatform\Metadata\Resource\Factory\AttributesResourceNameCollectionFactory;
145
use ApiPlatform\Metadata\Resource\Factory\ConcernsResourceMetadataCollectionFactory;
146
use ApiPlatform\Metadata\Resource\Factory\ConcernsResourceNameCollectionFactory;
147
use ApiPlatform\Metadata\Resource\Factory\FiltersResourceMetadataCollectionFactory;
148
use ApiPlatform\Metadata\Resource\Factory\FormatsResourceMetadataCollectionFactory;
149
use ApiPlatform\Metadata\Resource\Factory\InputOutputResourceMetadataCollectionFactory;
150
use ApiPlatform\Metadata\Resource\Factory\LinkFactory;
151
use ApiPlatform\Metadata\Resource\Factory\LinkFactoryInterface;
152
use ApiPlatform\Metadata\Resource\Factory\LinkResourceMetadataCollectionFactory;
153
use ApiPlatform\Metadata\Resource\Factory\NotExposedOperationResourceMetadataCollectionFactory;
154
use ApiPlatform\Metadata\Resource\Factory\OperationNameResourceMetadataCollectionFactory;
155
use ApiPlatform\Metadata\Resource\Factory\ParameterResourceMetadataCollectionFactory;
156
use ApiPlatform\Metadata\Resource\Factory\PhpDocResourceMetadataCollectionFactory;
157
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
158
use ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface;
159
use ApiPlatform\Metadata\Resource\Factory\UriTemplateResourceMetadataCollectionFactory;
160
use ApiPlatform\Metadata\ResourceAccessCheckerInterface;
161
use ApiPlatform\Metadata\ResourceClassResolver;
162
use ApiPlatform\Metadata\ResourceClassResolverInterface;
163
use ApiPlatform\Metadata\UrlGeneratorInterface;
164
use ApiPlatform\Metadata\Util\Inflector;
165
use ApiPlatform\OpenApi\Factory\OpenApiFactory;
166
use ApiPlatform\OpenApi\Factory\OpenApiFactoryInterface;
167
use ApiPlatform\OpenApi\Options;
168
use ApiPlatform\OpenApi\Serializer\OpenApiNormalizer;
169
use ApiPlatform\Serializer\Filter\FilterInterface as SerializerFilterInterface;
170
use ApiPlatform\Serializer\Filter\PropertyFilter;
171
use ApiPlatform\Serializer\ItemNormalizer;
172
use ApiPlatform\Serializer\JsonEncoder;
173
use ApiPlatform\Serializer\Mapping\Factory\ClassMetadataFactory as SerializerClassMetadataFactory;
174
use ApiPlatform\Serializer\Mapping\Loader\PropertyMetadataLoader;
175
use ApiPlatform\Serializer\Parameter\SerializerFilterParameterProvider;
176
use ApiPlatform\Serializer\SerializerContextBuilder;
177
use ApiPlatform\State\CallableProcessor;
178
use ApiPlatform\State\CallableProvider;
179
use ApiPlatform\State\Pagination\Pagination;
180
use ApiPlatform\State\Pagination\PaginationOptions;
181
use ApiPlatform\State\ParameterProviderInterface;
182
use ApiPlatform\State\Processor\AddLinkHeaderProcessor;
183
use ApiPlatform\State\Processor\RespondProcessor;
184
use ApiPlatform\State\Processor\SerializeProcessor;
185
use ApiPlatform\State\Processor\WriteProcessor;
186
use ApiPlatform\State\ProcessorInterface;
187
use ApiPlatform\State\Provider\ContentNegotiationProvider;
188
use ApiPlatform\State\Provider\DeserializeProvider;
189
use ApiPlatform\State\Provider\ParameterProvider;
190
use ApiPlatform\State\Provider\ReadProvider;
191
use ApiPlatform\State\Provider\SecurityParameterProvider;
192
use ApiPlatform\State\ProviderInterface;
193
use ApiPlatform\State\SerializerContextBuilderInterface;
194
use Illuminate\Config\Repository as ConfigRepository;
195
use Illuminate\Contracts\Debug\ExceptionHandler as ExceptionHandlerInterface;
196
use Illuminate\Contracts\Foundation\Application;
197
use Illuminate\Routing\Router;
198
use Illuminate\Support\ServiceProvider;
199
use Negotiation\Negotiator;
200
use phpDocumentor\Reflection\DocBlockFactory;
201
use Psr\Log\LoggerInterface;
202
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
203
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
204
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
205
use Symfony\Component\PropertyInfo\PropertyInfoExtractor;
206
use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface;
207
use Symfony\Component\Routing\RequestContext;
208
use Symfony\Component\Serializer\Encoder\CsvEncoder;
209
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
210
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
211
use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader;
212
use Symfony\Component\Serializer\Mapping\Loader\LoaderChain;
213
use Symfony\Component\Serializer\Mapping\Loader\LoaderInterface;
214
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
215
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
216
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
217
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
218
use Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer;
219
use Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer;
220
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
221
use Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer;
222
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
223
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
224
use Symfony\Component\Serializer\Serializer;
225
use Symfony\Component\Serializer\SerializerInterface;
226
use Symfony\Component\WebLink\HttpHeaderSerializer;
227

228
class ApiPlatformProvider extends ServiceProvider
229
{
230
    /**
231
     * Register services.
232
     */
233
    public function register(): void
234
    {
235
        $this->mergeConfigFrom(__DIR__.'/config/api-platform.php', 'api-platform');
×
236

237
        $this->app->singleton(PropertyInfoExtractorInterface::class, function () {
×
238
            $phpDocExtractor = class_exists(DocBlockFactory::class) ? new PhpDocExtractor() : null;
×
239
            $reflectionExtractor = new ReflectionExtractor();
×
240

241
            return new PropertyInfoExtractor(
×
242
                [$reflectionExtractor],
×
243
                $phpDocExtractor ? [$phpDocExtractor, $reflectionExtractor] : [$reflectionExtractor],
×
244
                $phpDocExtractor ? [$phpDocExtractor] : [],
×
245
                [$reflectionExtractor],
×
246
                [$reflectionExtractor]
×
247
            );
×
248
        });
×
249

NEW
250
        $this->app->singleton(ModelMetadata::class);
×
251
        $this->app->bind(LoaderInterface::class, AttributeLoader::class);
×
252
        $this->app->bind(ClassMetadataFactoryInterface::class, ClassMetadataFactory::class);
×
253
        $this->app->singleton(ClassMetadataFactory::class, function (Application $app) {
×
254
            return new ClassMetadataFactory(
×
255
                new LoaderChain([
×
256
                    new PropertyMetadataLoader(
×
257
                        $app->make(PropertyNameCollectionFactoryInterface::class),
×
258
                    ),
×
259
                    new AttributeLoader(),
×
260
                ])
×
261
            );
×
262
        });
×
263

264
        $this->app->singleton(SerializerClassMetadataFactory::class, function (Application $app) {
×
265
            return new SerializerClassMetadataFactory($app->make(ClassMetadataFactoryInterface::class));
×
266
        });
×
267

268
        $this->app->bind(PathSegmentNameGeneratorInterface::class, UnderscorePathSegmentNameGenerator::class);
×
269

270
        $this->app->singleton(ResourceNameCollectionFactoryInterface::class, function (Application $app) {
×
271
            /** @var ConfigRepository */
272
            $config = $app['config'];
×
273
            $paths = $config->get('api-platform.resources') ?? [];
×
274
            $refl = new \ReflectionClass(Error::class);
×
275
            $paths[] = \dirname($refl->getFileName());
×
276

277
            $logger = $app->make(LoggerInterface::class);
×
278

279
            foreach ($paths as $i => $path) {
×
280
                if (!file_exists($path)) {
×
281
                    $logger->warning(\sprintf('We skipped reading resources in "%s" as the path does not exist. Please check the configuration at "api-platform.resources".', $path));
×
282
                    unset($paths[$i]);
×
283
                }
284
            }
285

286
            return new ConcernsResourceNameCollectionFactory($paths, new AttributesResourceNameCollectionFactory($paths));
×
287
        });
×
288

289
        $this->app->bind(ResourceClassResolverInterface::class, ResourceClassResolver::class);
×
290
        $this->app->singleton(ResourceClassResolver::class, function (Application $app) {
×
291
            return new EloquentResourceClassResolver(new ResourceClassResolver($app->make(ResourceNameCollectionFactoryInterface::class)));
×
292
        });
×
293

294
        $this->app->singleton(PropertyMetadataFactoryInterface::class, function (Application $app) {
×
295
            return new PropertyInfoPropertyMetadataFactory(
×
296
                $app->make(PropertyInfoExtractorInterface::class),
×
297
                new EloquentPropertyMetadataFactory(
×
298
                    $app->make(ModelMetadata::class),
×
299
                )
×
300
            );
×
301
        });
×
302

303
        $this->app->extend(PropertyMetadataFactoryInterface::class, function (PropertyInfoPropertyMetadataFactory $inner, Application $app) {
×
304
            /** @var ConfigRepository $config */
305
            $config = $app['config'];
×
306

307
            return new CachePropertyMetadataFactory(
×
308
                new SchemaPropertyMetadataFactory(
×
309
                    $app->make(ResourceClassResolverInterface::class),
×
310
                    new SerializerPropertyMetadataFactory(
×
311
                        $app->make(SerializerClassMetadataFactory::class),
×
312
                        new AttributePropertyMetadataFactory(
×
313
                            new EloquentAttributePropertyMetadataFactory(
×
314
                                $inner,
×
315
                            )
×
316
                        ),
×
317
                        $app->make(ResourceClassResolverInterface::class)
×
318
                    ),
×
319
                ),
×
320
                true === $config->get('app.debug') ? 'array' : $config->get('api-platform.cache', 'file')
×
321
            );
×
322
        });
×
323

324
        $this->app->singleton(PropertyNameCollectionFactoryInterface::class, function (Application $app) {
×
325
            /** @var ConfigRepository $config */
326
            $config = $app['config'];
×
327

328
            return new CachePropertyNameCollectionMetadataFactory(
×
329
                new ClassLevelAttributePropertyNameCollectionFactory(
×
330
                    new ConcernsPropertyNameCollectionMetadataFactory(
×
331
                        new EloquentPropertyNameCollectionMetadataFactory(
×
332
                            $app->make(ModelMetadata::class),
×
333
                            new PropertyInfoPropertyNameCollectionFactory($app->make(PropertyInfoExtractorInterface::class)),
×
334
                            $app->make(ResourceClassResolverInterface::class)
×
335
                        )
×
336
                    )
×
337
                ),
×
338
                true === $config->get('app.debug') ? 'array' : $config->get('api-platform.cache', 'file')
×
339
            );
×
340
        });
×
341

342
        $this->app->singleton(LinkFactoryInterface::class, function (Application $app) {
×
343
            return new LinkFactory(
×
344
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
345
                $app->make(PropertyMetadataFactoryInterface::class),
×
346
                $app->make(ResourceClassResolverInterface::class),
×
347
            );
×
348
        });
×
349

350
        // TODO: add cached metadata factories
351
        $this->app->singleton(ResourceMetadataCollectionFactoryInterface::class, function (Application $app) {
×
352
            /** @var ConfigRepository $config */
353
            $config = $app['config'];
×
354
            $formats = $config->get('api-platform.formats');
×
355

356
            if ($config->get('api-platform.swagger_ui.enabled', false) && !isset($formats['html'])) {
×
357
                $formats['html'] = ['text/html'];
×
358
            }
359

360
            return new CacheResourceCollectionMetadataFactory(
×
361
                new EloquentResourceCollectionMetadataFactory(
×
362
                    new ParameterValidationResourceMetadataCollectionFactory(
×
363
                        new ParameterResourceMetadataCollectionFactory(
×
364
                            $this->app->make(PropertyNameCollectionFactoryInterface::class),
×
365
                            $this->app->make(PropertyMetadataFactoryInterface::class),
×
366
                            new AlternateUriResourceMetadataCollectionFactory(
×
367
                                new FiltersResourceMetadataCollectionFactory(
×
368
                                    new FormatsResourceMetadataCollectionFactory(
×
369
                                        new InputOutputResourceMetadataCollectionFactory(
×
370
                                            new PhpDocResourceMetadataCollectionFactory(
×
371
                                                new OperationNameResourceMetadataCollectionFactory(
×
372
                                                    new LinkResourceMetadataCollectionFactory(
×
373
                                                        $app->make(LinkFactoryInterface::class),
×
374
                                                        new UriTemplateResourceMetadataCollectionFactory(
×
375
                                                            $app->make(LinkFactoryInterface::class),
×
376
                                                            $app->make(PathSegmentNameGeneratorInterface::class),
×
377
                                                            new NotExposedOperationResourceMetadataCollectionFactory(
×
378
                                                                $app->make(LinkFactoryInterface::class),
×
379
                                                                new AttributesResourceMetadataCollectionFactory(
×
380
                                                                    new ConcernsResourceMetadataCollectionFactory(
×
381
                                                                        null,
×
382
                                                                        $app->make(LoggerInterface::class),
×
383
                                                                        $config->get('api-platform.defaults', []),
×
384
                                                                        $config->get('api-platform.graphql.enabled'),
×
385
                                                                    ),
×
386
                                                                    $app->make(LoggerInterface::class),
×
387
                                                                    $config->get('api-platform.defaults', []),
×
388
                                                                    $config->get('api-platform.graphql.enabled'),
×
389
                                                                ),
×
390
                                                            )
×
391
                                                        ),
×
392
                                                        $config->get('api-platform.graphql.enabled')
×
393
                                                    )
×
394
                                                )
×
395
                                            )
×
396
                                        ),
×
397
                                        $formats,
×
398
                                        $config->get('api-platform.patch_formats'),
×
399
                                    )
×
400
                                )
×
401
                            ),
×
402
                            $app->make('filters'),
×
403
                            $app->make(CamelCaseToSnakeCaseNameConverter::class)
×
404
                        ),
×
405
                        $app->make('filters')
×
406
                    )
×
407
                ),
×
408
                true === $config->get('app.debug') ? 'array' : $config->get('api-platform.cache', 'file')
×
409
            );
×
410
        });
×
411

412
        $this->app->bind(PropertyAccessorInterface::class, function () {
×
413
            return new EloquentPropertyAccessor();
×
414
        });
×
415

416
        $this->app->bind(NameConverterInterface::class, function (Application $app) {
×
417
            $config = $app['config'];
×
418
            $defaultContext = $config->get('api-platform.serializer', []);
×
419

420
            return new HydraPrefixNameConverter(new MetadataAwareNameConverter($app->make(ClassMetadataFactoryInterface::class), $app->make(SnakeCaseToCamelCaseNameConverter::class)), $defaultContext);
×
421
        });
×
422

423
        $this->app->bind(OperationMetadataFactoryInterface::class, OperationMetadataFactory::class);
×
424

425
        $this->app->tag([
×
426
            EqualsFilter::class,
×
427
            PartialSearchFilter::class,
×
428
            DateFilter::class,
×
429
            OrderFilter::class,
×
430
            RangeFilter::class,
×
431
            SortFilter::class,
×
432
            SparseFieldset::class,
×
433
        ], EloquentFilterInterface::class);
×
434

435
        $this->app->bind(FilterQueryExtension::class, function (Application $app) {
×
436
            $tagged = iterator_to_array($app->tagged(EloquentFilterInterface::class));
×
437

438
            return new FilterQueryExtension(new ServiceLocator($tagged));
×
439
        });
×
440

441
        $this->app->tag([FilterQueryExtension::class], QueryExtensionInterface::class);
×
442

443
        $this->app->singleton(ItemProvider::class, function (Application $app) {
×
444
            $tagged = iterator_to_array($app->tagged(LinksHandlerInterface::class));
×
445

446
            return new ItemProvider(new LinksHandler($app, $app->make(ResourceMetadataCollectionFactoryInterface::class)), new ServiceLocator($tagged));
×
447
        });
×
448
        $this->app->singleton(CollectionProvider::class, function (Application $app) {
×
449
            $tagged = iterator_to_array($app->tagged(LinksHandlerInterface::class));
×
450

451
            return new CollectionProvider($app->make(Pagination::class), new LinksHandler($app, $app->make(ResourceMetadataCollectionFactoryInterface::class)), $app->tagged(QueryExtensionInterface::class), new ServiceLocator($tagged));
×
452
        });
×
453
        $this->app->tag([ItemProvider::class, CollectionProvider::class], ProviderInterface::class);
×
454

455
        $this->app->singleton(CallableProvider::class, function (Application $app) {
×
456
            $tagged = iterator_to_array($app->tagged(ProviderInterface::class));
×
457

458
            return new CallableProvider(new ServiceLocator($tagged));
×
459
        });
×
460

461
        $this->app->singleton(ReadProvider::class, function (Application $app) {
×
462
            return new ReadProvider($app->make(CallableProvider::class));
×
463
        });
×
464

465
        $this->app->singleton(SwaggerUiProvider::class, function (Application $app) {
×
466
            /** @var ConfigRepository */
467
            $config = $app['config'];
×
468

469
            return new SwaggerUiProvider($app->make(ReadProvider::class), $app->make(OpenApiFactoryInterface::class), $config->get('api-platform.swagger_ui.enabled', false));
×
470
        });
×
471

472
        $this->app->singleton(ValidateProvider::class, function (Application $app) {
×
473
            return new ValidateProvider($app->make(SwaggerUiProvider::class), $app);
×
474
        });
×
475

476
        $this->app->singleton(DeserializeProvider::class, function (Application $app) {
×
477
            return new DeserializeProvider($app->make(ValidateProvider::class), $app->make(SerializerInterface::class), $app->make(SerializerContextBuilderInterface::class));
×
478
        });
×
479

480
        if (class_exists(JsonApiProvider::class)) {
×
481
            $this->app->extend(DeserializeProvider::class, function (ProviderInterface $inner, Application $app) {
×
482
                return new JsonApiProvider($inner);
×
483
            });
×
484
        }
485

486
        $this->app->tag([PropertyFilter::class], SerializerFilterInterface::class);
×
487

488
        $this->app->singleton(SerializerFilterParameterProvider::class, function (Application $app) {
×
489
            $tagged = iterator_to_array($app->tagged(SerializerFilterInterface::class));
×
490

491
            return new SerializerFilterParameterProvider(new ServiceLocator($tagged));
×
492
        });
×
493
        $this->app->alias(SerializerFilterParameterProvider::class, 'api_platform.serializer.filter_parameter_provider');
×
494

495
        $this->app->singleton(SortFilterParameterProvider::class, function (Application $app) {
×
496
            return new SortFilterParameterProvider();
×
497
        });
×
498
        $this->app->tag([SerializerFilterParameterProvider::class, SortFilterParameterProvider::class, SparseFieldsetParameterProvider::class], ParameterProviderInterface::class);
×
499

500
        $this->app->singleton('filters', function (Application $app) {
×
501
            return new ServiceLocator(array_merge(
×
502
                iterator_to_array($app->tagged(SerializerFilterInterface::class)),
×
503
                iterator_to_array($app->tagged(EloquentFilterInterface::class))
×
504
            ));
×
505
        });
×
506

507
        $this->app->singleton(ParameterProvider::class, function (Application $app) {
×
508
            $tagged = iterator_to_array($app->tagged(ParameterProviderInterface::class));
×
509
            $tagged['api_platform.serializer.filter_parameter_provider'] = $app->make(SerializerFilterParameterProvider::class);
×
510

511
            return new ParameterProvider(
×
512
                new ParameterValidatorProvider(
×
513
                    new SecurityParameterProvider(
×
514
                        $app->make(DeserializeProvider::class),
×
515
                        $app->make(ResourceAccessCheckerInterface::class)
×
516
                    ),
×
517
                ),
×
518
                new ServiceLocator($tagged)
×
519
            );
×
520
        });
×
521

522
        $this->app->singleton(AccessCheckerProvider::class, function (Application $app) {
×
523
            return new AccessCheckerProvider($app->make(ParameterProvider::class), $app->make(ResourceAccessCheckerInterface::class));
×
524
        });
×
525

526
        $this->app->singleton(Negotiator::class, function (Application $app) {
×
527
            return new Negotiator();
×
528
        });
×
529
        $this->app->singleton(ContentNegotiationProvider::class, function (Application $app) {
×
530
            /** @var ConfigRepository */
531
            $config = $app['config'];
×
532

533
            return new ContentNegotiationProvider($app->make(AccessCheckerProvider::class), $app->make(Negotiator::class), $config->get('api-platform.formats'), $config->get('api-platform.error_formats'));
×
534
        });
×
535

536
        $this->app->bind(ProviderInterface::class, ContentNegotiationProvider::class);
×
537

538
        $this->app->tag([RemoveProcessor::class, PersistProcessor::class], ProcessorInterface::class);
×
539
        $this->app->singleton(CallableProcessor::class, function (Application $app) {
×
540
            /** @var ConfigRepository */
541
            $config = $app['config'];
×
542
            $tagged = iterator_to_array($app->tagged(ProcessorInterface::class));
×
543

544
            if ($config->get('api-platform.swagger_ui.enabled', false)) {
×
545
                // TODO: tag SwaggerUiProcessor instead?
546
                $tagged['api_platform.swagger_ui.processor'] = $app->make(SwaggerUiProcessor::class);
×
547
            }
548

549
            return new CallableProcessor(new ServiceLocator($tagged));
×
550
        });
×
551

552
        $this->app->singleton(RespondProcessor::class, function () {
×
553
            return new AddLinkHeaderProcessor(new RespondProcessor(), new HttpHeaderSerializer());
×
554
        });
×
555

556
        $this->app->singleton(SerializeProcessor::class, function (Application $app) {
×
557
            return new SerializeProcessor($app->make(RespondProcessor::class), $app->make(Serializer::class), $app->make(SerializerContextBuilderInterface::class));
×
558
        });
×
559

560
        $this->app->singleton(WriteProcessor::class, function (Application $app) {
×
561
            return new WriteProcessor($app->make(SerializeProcessor::class), $app->make(CallableProcessor::class));
×
562
        });
×
563

564
        $this->app->singleton(SerializerContextBuilder::class, function (Application $app) {
×
565
            /** @var ConfigRepository */
566
            $config = $app['config'];
×
567

568
            return new SerializerContextBuilder($app->make(ResourceMetadataCollectionFactoryInterface::class), $config->get('app.debug'));
×
569
        });
×
570
        $this->app->bind(SerializerContextBuilderInterface::class, EloquentSerializerContextBuilder::class);
×
571
        $this->app->singleton(EloquentSerializerContextBuilder::class, function (Application $app) {
×
572
            return new EloquentSerializerContextBuilder(
×
573
                $app->make(SerializerContextBuilder::class),
×
574
                $app->make(PropertyNameCollectionFactoryInterface::class)
×
575
            );
×
576
        });
×
577

578
        $this->app->singleton(HydraLinkProcessor::class, function (Application $app) {
×
579
            return new HydraLinkProcessor($app->make(WriteProcessor::class), $app->make(UrlGeneratorInterface::class));
×
580
        });
×
581

582
        $this->app->bind(ProcessorInterface::class, function (Application $app) {
×
583
            $config = $app['config'];
×
584
            if ($config->has('api-platform.formats.jsonld')) {
×
585
                return $app->make(HydraLinkProcessor::class);
×
586
            }
587

588
            return $app->make(WriteProcessor::class);
×
589
        });
×
590

591
        $this->app->singleton(ObjectNormalizer::class, function (Application $app) {
×
592
            $config = $app['config'];
×
593
            $defaultContext = $config->get('api-platform.serializer', []);
×
594

595
            return new ObjectNormalizer(defaultContext: $defaultContext);
×
596
        });
×
597

598
        $this->app->singleton(DateTimeNormalizer::class, function (Application $app) {
×
599
            $config = $app['config'];
×
600
            $defaultContext = $config->get('api-platform.serializer', []);
×
601

602
            return new DateTimeNormalizer(defaultContext: $defaultContext);
×
603
        });
×
604

605
        $this->app->singleton(DateTimeZoneNormalizer::class, function () {
×
606
            return new DateTimeZoneNormalizer();
×
607
        });
×
608

609
        $this->app->singleton(DateIntervalNormalizer::class, function (Application $app) {
×
610
            $config = $app['config'];
×
611
            $defaultContext = $config->get('api-platform.serializer', []);
×
612

613
            return new DateIntervalNormalizer(defaultContext: $defaultContext);
×
614
        });
×
615

616
        $this->app->singleton(JsonEncoder::class, function () {
×
617
            return new JsonEncoder('jsonld');
×
618
        });
×
619

620
        $this->app->bind(IriConverterInterface::class, IriConverter::class);
×
621
        $this->app->singleton(IriConverter::class, function (Application $app) {
×
622
            return new IriConverter($app->make(CallableProvider::class), $app->make(OperationMetadataFactoryInterface::class), $app->make(UrlGeneratorRouter::class), $app->make(IdentifiersExtractorInterface::class), $app->make(ResourceClassResolverInterface::class), $app->make(ResourceMetadataCollectionFactoryInterface::class), $app->make(SkolemIriConverter::class));
×
623
        });
×
624

625
        $this->app->singleton(SkolemIriConverter::class, function (Application $app) {
×
626
            return new SkolemIriConverter($app->make(UrlGeneratorRouter::class));
×
627
        });
×
628

629
        $this->app->bind(IdentifiersExtractorInterface::class, IdentifiersExtractor::class);
×
630
        $this->app->singleton(IdentifiersExtractor::class, function (Application $app) {
×
631
            return new EloquentIdentifiersExtractor(
×
632
                new IdentifiersExtractor(
×
633
                    $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
634
                    $app->make(ResourceClassResolverInterface::class),
×
635
                    $app->make(PropertyNameCollectionFactoryInterface::class),
×
636
                    $app->make(PropertyMetadataFactoryInterface::class),
×
637
                    $app->make(PropertyAccessorInterface::class)
×
638
                )
×
639
            );
×
640
        });
×
641

642
        $this->app->bind(UrlGeneratorInterface::class, UrlGeneratorRouter::class);
×
643
        $this->app->singleton(UrlGeneratorRouter::class, function (Application $app) {
×
644
            $request = $app->make('request');
×
645
            // https://github.com/laravel/framework/blob/2bfb70bca53e24227a6f921f39d84ba452efd8e0/src/Illuminate/Routing/CompiledRouteCollection.php#L112
646
            $trimmedRequest = $request->duplicate();
×
647
            $parts = explode('?', $request->server->get('REQUEST_URI'), 2);
×
648
            $trimmedRequest->server->set(
×
649
                'REQUEST_URI',
×
650
                rtrim($parts[0], '/').(isset($parts[1]) ? '?'.$parts[1] : '')
×
651
            );
×
652

653
            $urlGenerator = new UrlGeneratorRouter($app->make(Router::class));
×
654
            $urlGenerator->setContext((new RequestContext())->fromRequest($trimmedRequest));
×
655

656
            return $urlGenerator;
×
657
        });
×
658

659
        $this->app->bind(ContextBuilderInterface::class, JsonLdContextBuilder::class);
×
660
        $this->app->singleton(JsonLdContextBuilder::class, function (Application $app) {
×
661
            $config = $app['config'];
×
662
            $defaultContext = $config->get('api-platform.serializer', []);
×
663

664
            return new JsonLdContextBuilder(
×
665
                $app->make(ResourceNameCollectionFactoryInterface::class),
×
666
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
667
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
668
                $app->make(PropertyMetadataFactoryInterface::class),
×
669
                $app->make(UrlGeneratorInterface::class),
×
670
                $app->make(IriConverterInterface::class),
×
671
                $app->make(NameConverterInterface::class),
×
672
                $defaultContext
×
673
            );
×
674
        });
×
675

676
        $this->app->singleton(HydraEntrypointNormalizer::class, function (Application $app) {
×
677
            return new HydraEntrypointNormalizer($app->make(ResourceMetadataCollectionFactoryInterface::class), $app->make(IriConverterInterface::class), $app->make(UrlGeneratorInterface::class));
×
678
        });
×
679

680
        $this->app->singleton(ResourceAccessCheckerInterface::class, function () {
×
681
            return new ResourceAccessChecker();
×
682
        });
×
683

684
        $this->app->singleton(ItemNormalizer::class, function (Application $app) {
×
685
            /** @var ConfigRepository */
686
            $config = $app['config'];
×
687
            $defaultContext = $config->get('api-platform.serializer', []);
×
688

689
            return new ItemNormalizer(
×
690
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
691
                $app->make(PropertyMetadataFactoryInterface::class),
×
692
                $app->make(IriConverterInterface::class),
×
693
                $app->make(ResourceClassResolverInterface::class),
×
694
                $app->make(PropertyAccessorInterface::class),
×
695
                $app->make(NameConverterInterface::class),
×
696
                $app->make(ClassMetadataFactoryInterface::class),
×
697
                $app->make(LoggerInterface::class),
×
698
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
699
                $app->make(ResourceAccessCheckerInterface::class),
×
700
                $defaultContext
×
701
            );
×
702
        });
×
703

704
        $this->app->bind(AnonymousContextBuilderInterface::class, JsonLdContextBuilder::class);
×
705

706
        $this->app->singleton(JsonLdObjectNormalizer::class, function (Application $app) {
×
707
            return new JsonLdObjectNormalizer(
×
708
                $app->make(ObjectNormalizer::class),
×
709
                $app->make(IriConverterInterface::class),
×
710
                $app->make(AnonymousContextBuilderInterface::class)
×
711
            );
×
712
        });
×
713

714
        $this->app->singleton(HalCollectionNormalizer::class, function (Application $app) {
×
715
            /** @var ConfigRepository */
716
            $config = $app['config'];
×
717

718
            return new HalCollectionNormalizer(
×
719
                $app->make(ResourceClassResolverInterface::class),
×
720
                $config->get('api-platform.pagination.page_parameter_name'),
×
721
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
722
            );
×
723
        });
×
724

725
        $this->app->singleton(HalObjectNormalizer::class, function (Application $app) {
×
726
            return new HalObjectNormalizer(
×
727
                $app->make(ObjectNormalizer::class),
×
728
                $app->make(IriConverterInterface::class)
×
729
            );
×
730
        });
×
731

732
        $this->app->singleton(HalItemNormalizer::class, function (Application $app) {
×
733
            /** @var ConfigRepository */
734
            $config = $app['config'];
×
735
            $defaultContext = $config->get('api-platform.serializer', []);
×
736

737
            return new HalItemNormalizer(
×
738
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
739
                $app->make(PropertyMetadataFactoryInterface::class),
×
740
                $app->make(IriConverterInterface::class),
×
741
                $app->make(ResourceClassResolverInterface::class),
×
742
                $app->make(PropertyAccessorInterface::class),
×
743
                $app->make(NameConverterInterface::class),
×
744
                $app->make(ClassMetadataFactoryInterface::class),
×
745
                $defaultContext,
×
746
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
747
                $app->make(ResourceAccessCheckerInterface::class),
×
748
            );
×
749
        });
×
750

751
        $this->app->singleton(Options::class, function (Application $app) {
×
752
            /** @var ConfigRepository */
753
            $config = $app['config'];
×
754

755
            return new Options(
×
756
                title: $config->get('api-platform.title', ''),
×
757
                description: $config->get('api-platform.description', ''),
×
758
                version: $config->get('api-platform.version', ''),
×
759
                oAuthEnabled: $config->get('api-platform.swagger_ui.oauth.enabled', false),
×
760
                oAuthType: $config->get('api-platform.swagger_ui.oauth.type', null),
×
761
                oAuthFlow: $config->get('api-platform.swagger_ui.oauth.flow', null),
×
762
                oAuthTokenUrl: $config->get('api-platform.swagger_ui.oauth.tokenUrl', null),
×
763
                oAuthAuthorizationUrl: $config->get('api-platform.swagger_ui.oauth.authorizationUrl', null),
×
764
                oAuthRefreshUrl: $config->get('api-platform.swagger_ui.oauth.refreshUrl', null),
×
765
                oAuthScopes: $config->get('api-platform.swagger_ui.oauth.scopes', []),
×
766
                apiKeys: $config->get('api-platform.swagger_ui.apiKeys', []),
×
767
                contactName: $config->get('api-platform.swagger_ui.contact.name', ''),
×
768
                contactUrl: $config->get('api-platform.swagger_ui.contact.url', ''),
×
769
                contactEmail: $config->get('api-platform.swagger_ui.contact.email', ''),
×
770
                licenseName: $config->get('api-platform.swagger_ui.license.name', ''),
×
771
                licenseUrl: $config->get('api-platform.swagger_ui.license.url', ''),
×
772
            );
×
773
        });
×
774

775
        $this->app->singleton(SwaggerUiProcessor::class, function (Application $app) {
×
776
            /** @var ConfigRepository */
777
            $config = $app['config'];
×
778

779
            return new SwaggerUiProcessor(
×
780
                urlGenerator: $app->make(UrlGeneratorInterface::class),
×
781
                normalizer: $app->make(NormalizerInterface::class),
×
782
                openApiOptions: $app->make(Options::class),
×
783
                oauthClientId: $config->get('api-platform.swagger_ui.oauth.clientId'),
×
784
                oauthClientSecret: $config->get('api-platform.swagger_ui.oauth.clientSecret'),
×
785
                oauthPkce: $config->get('api-platform.swagger_ui.oauth.pkce', false),
×
786
            );
×
787
        });
×
788

789
        $this->app->singleton(DocumentationController::class, function (Application $app) {
×
790
            /** @var ConfigRepository */
791
            $config = $app['config'];
×
792

793
            return new DocumentationController($app->make(ResourceNameCollectionFactoryInterface::class), $config->get('api-platform.title') ?? '', $config->get('api-platform.description') ?? '', $config->get('api-platform.version') ?? '', $app->make(OpenApiFactoryInterface::class), $app->make(ProviderInterface::class), $app->make(ProcessorInterface::class), $app->make(Negotiator::class), $config->get('api-platform.docs_formats'), $config->get('api-platform.swagger_ui.enabled', false));
×
794
        });
×
795

796
        $this->app->singleton(EntrypointController::class, function (Application $app) {
×
797
            /** @var ConfigRepository */
798
            $config = $app['config'];
×
799

800
            return new EntrypointController($app->make(ResourceNameCollectionFactoryInterface::class), $app->make(ProviderInterface::class), $app->make(ProcessorInterface::class), $config->get('api-platform.docs_formats'));
×
801
        });
×
802

803
        $this->app->singleton(Pagination::class, function (Application $app) {
×
804
            /** @var ConfigRepository */
805
            $config = $app['config'];
×
806

807
            return new Pagination($config->get('api-platform.pagination'), []);
×
808
        });
×
809

810
        $this->app->singleton(PaginationOptions::class, function (Application $app) {
×
811
            /** @var ConfigRepository */
812
            $config = $app['config'];
×
813
            $defaults = $config->get('api-platform.defaults');
×
814
            $pagination = $config->get('api-platform.pagination');
×
815

816
            return new PaginationOptions(
×
817
                $defaults['pagination_enabled'],
×
818
                $pagination['page_parameter_name'],
×
819
                $defaults['pagination_client_items_per_page'],
×
820
                $pagination['items_per_page_parameter_name'],
×
821
                $defaults['pagination_client_enabled'],
×
822
                $pagination['enabled_parameter_name'],
×
823
                $defaults['pagination_items_per_page'],
×
824
                $defaults['pagination_maximum_items_per_page'],
×
825
                $defaults['pagination_partial'],
×
826
                $defaults['pagination_client_partial'],
×
827
                $pagination['partial_parameter_name'],
×
828
            );
×
829
        });
×
830

831
        $this->app->bind(OpenApiFactoryInterface::class, OpenApiFactory::class);
×
832
        $this->app->singleton(OpenApiFactory::class, function (Application $app) {
×
833
            /** @var ConfigRepository */
834
            $config = $app['config'];
×
835

836
            return new OpenApiFactory(
×
837
                $app->make(ResourceNameCollectionFactoryInterface::class),
×
838
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
839
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
840
                $app->make(PropertyMetadataFactoryInterface::class),
×
841
                $app->make(SchemaFactoryInterface::class),
×
842
                null,
×
843
                $config->get('api-platform.formats'),
×
844
                $app->make(Options::class),
×
845
                $app->make(PaginationOptions::class), // ?PaginationOptions $paginationOptions = null,
×
846
                // ?RouterInterface $router = null
×
847
            );
×
848
        });
×
849

850
        $this->app->bind(DefinitionNameFactoryInterface::class, DefinitionNameFactory::class);
×
851
        $this->app->singleton(DefinitionNameFactory::class, function (Application $app) {
×
852
            /** @var ConfigRepository */
853
            $config = $app['config'];
×
854

855
            return new DefinitionNameFactory($config->get('api-platform.formats'));
×
856
        });
×
857

858
        $this->app->singleton(SchemaFactory::class, function (Application $app) {
×
859
            /** @var ConfigRepository */
860
            $config = $app['config'];
×
861

862
            return new SchemaFactory(
×
863
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
864
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
865
                $app->make(PropertyMetadataFactoryInterface::class),
×
866
                $app->make(NameConverterInterface::class),
×
867
                $app->make(ResourceClassResolverInterface::class),
×
868
                $config->get('api-platform.formats'),
×
869
                $app->make(DefinitionNameFactoryInterface::class),
×
870
            );
×
871
        });
×
872
        $this->app->singleton(JsonApiSchemaFactory::class, function (Application $app) {
×
873
            return new JsonApiSchemaFactory(
×
874
                $app->make(SchemaFactory::class),
×
875
                $app->make(PropertyMetadataFactoryInterface::class),
×
876
                $app->make(ResourceClassResolverInterface::class),
×
877
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
878
                $app->make(DefinitionNameFactoryInterface::class),
×
879
            );
×
880
        });
×
881
        $this->app->singleton(HydraSchemaFactory::class, function (Application $app) {
×
882
            $config = $app['config'];
×
883
            $defaultContext = $config->get('api-platform.serializer', []);
×
884

885
            return new HydraSchemaFactory(
×
886
                $app->make(JsonApiSchemaFactory::class),
×
887
                $defaultContext
×
888
            );
×
889
        });
×
890

891
        $this->app->bind(SchemaFactoryInterface::class, HydraSchemaFactory::class);
×
892

893
        $this->app->singleton(OpenApiNormalizer::class, function (Application $app) {
×
894
            return new OpenApiNormalizer($app->make(ObjectNormalizer::class));
×
895
        });
×
896

897
        $this->app->singleton(HydraDocumentationNormalizer::class, function (Application $app) {
×
898
            $config = $app['config'];
×
899
            $defaultContext = $config->get('api-platform.serializer', []);
×
900

901
            return new HydraDocumentationNormalizer(
×
902
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
903
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
904
                $app->make(PropertyMetadataFactoryInterface::class),
×
905
                $app->make(ResourceClassResolverInterface::class),
×
906
                $app->make(UrlGeneratorInterface::class),
×
907
                $app->make(NameConverterInterface::class),
×
908
                $defaultContext
×
909
            );
×
910
        });
×
911

912
        $this->app->singleton(HydraPartialCollectionViewNormalizer::class, function (Application $app) {
×
913
            $config = $app['config'];
×
914
            $defaultContext = $config->get('api-platform.serializer', []);
×
915

916
            return new HydraPartialCollectionViewNormalizer(
×
917
                new HydraCollectionFiltersNormalizer(
×
918
                    new HydraCollectionNormalizer(
×
919
                        $app->make(ContextBuilderInterface::class),
×
920
                        $app->make(ResourceClassResolverInterface::class),
×
921
                        $app->make(IriConverterInterface::class),
×
922
                        $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
923
                        $defaultContext
×
924
                    ),
×
925
                    $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
926
                    $app->make(ResourceClassResolverInterface::class),
×
927
                    null, // filterLocator, we use only Parameters with Laravel and we don't need to call filters there
×
928
                    $defaultContext
×
929
                ),
×
930
                'page',
×
931
                'pagination',
×
932
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
933
                $app->make(PropertyAccessorInterface::class),
×
934
                $config->get('api-platform.url_generation_strategy', UrlGeneratorInterface::ABS_PATH),
×
935
                $defaultContext,
×
936
            );
×
937
        });
×
938

939
        $this->app->singleton(ReservedAttributeNameConverter::class, function (Application $app) {
×
940
            return new ReservedAttributeNameConverter($app->make(NameConverterInterface::class));
×
941
        });
×
942

943
        if (interface_exists(FieldsBuilderEnumInterface::class)) {
×
944
            $this->registerGraphQl($this->app);
×
945
        }
946

947
        $this->app->singleton(JsonApiEntrypointNormalizer::class, function (Application $app) {
×
948
            return new JsonApiEntrypointNormalizer(
×
949
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
950
                $app->make(IriConverterInterface::class),
×
951
                $app->make(UrlGeneratorInterface::class),
×
952
            );
×
953
        });
×
954

955
        $this->app->singleton(JsonApiCollectionNormalizer::class, function (Application $app) {
×
956
            /** @var ConfigRepository */
957
            $config = $app['config'];
×
958

959
            return new JsonApiCollectionNormalizer(
×
960
                $app->make(ResourceClassResolverInterface::class),
×
961
                $config->get('api-platform.pagination.page_parameter_name'),
×
962
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
963
            );
×
964
        });
×
965

966
        $this->app->singleton(JsonApiItemNormalizer::class, function (Application $app) {
×
967
            $config = $app['config'];
×
968
            $defaultContext = $config->get('api-platform.serializer', []);
×
969

970
            return new JsonApiItemNormalizer(
×
971
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
972
                $app->make(PropertyMetadataFactoryInterface::class),
×
973
                $app->make(IriConverterInterface::class),
×
974
                $app->make(ResourceClassResolverInterface::class),
×
975
                $app->make(PropertyAccessorInterface::class),
×
976
                $app->make(NameConverterInterface::class),
×
977
                $app->make(ClassMetadataFactoryInterface::class),
×
978
                $defaultContext,
×
979
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
980
                $app->make(ResourceAccessCheckerInterface::class),
×
981
                null
×
982
                // $app->make(TagCollectorInterface::class),
×
983
            );
×
984
        });
×
985

986
        $this->app->singleton(JsonApiErrorNormalizer::class, function (Application $app) {
×
987
            return new JsonApiErrorNormalizer(
×
988
                $app->make(JsonApiItemNormalizer::class),
×
989
            );
×
990
        });
×
991

992
        $this->app->singleton(JsonApiObjectNormalizer::class, function (Application $app) {
×
993
            return new JsonApiObjectNormalizer(
×
994
                $app->make(ObjectNormalizer::class),
×
995
                $app->make(IriConverterInterface::class),
×
996
                $app->make(ResourceClassResolverInterface::class),
×
997
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
998
            );
×
999
        });
×
1000

1001
        $this->app->singleton('api_platform_normalizer_list', function (Application $app) {
×
1002
            $list = new \SplPriorityQueue();
×
1003
            $list->insert($app->make(HydraEntrypointNormalizer::class), -800);
×
1004
            $list->insert($app->make(HydraPartialCollectionViewNormalizer::class), -800);
×
1005
            $list->insert($app->make(HalCollectionNormalizer::class), -800);
×
1006
            $list->insert($app->make(HalEntrypointNormalizer::class), -985);
×
1007
            $list->insert($app->make(HalObjectNormalizer::class), -995);
×
1008
            $list->insert($app->make(HalItemNormalizer::class), -890);
×
1009
            $list->insert($app->make(JsonLdItemNormalizer::class), -890);
×
1010
            $list->insert($app->make(JsonLdObjectNormalizer::class), -995);
×
1011
            $list->insert($app->make(ArrayDenormalizer::class), -990);
×
1012
            $list->insert($app->make(DateTimeZoneNormalizer::class), -915);
×
1013
            $list->insert($app->make(DateIntervalNormalizer::class), -915);
×
1014
            $list->insert($app->make(DateTimeNormalizer::class), -910);
×
1015
            $list->insert($app->make(BackedEnumNormalizer::class), -910);
×
1016
            $list->insert($app->make(ObjectNormalizer::class), -1000);
×
1017
            $list->insert($app->make(ItemNormalizer::class), -895);
×
1018
            $list->insert($app->make(OpenApiNormalizer::class), -780);
×
1019
            $list->insert($app->make(HydraDocumentationNormalizer::class), -790);
×
1020

1021
            $list->insert($app->make(JsonApiEntrypointNormalizer::class), -800);
×
1022
            $list->insert($app->make(JsonApiCollectionNormalizer::class), -985);
×
1023
            $list->insert($app->make(JsonApiItemNormalizer::class), -890);
×
1024
            $list->insert($app->make(JsonApiErrorNormalizer::class), -790);
×
1025
            $list->insert($app->make(JsonApiObjectNormalizer::class), -995);
×
1026

1027
            if (interface_exists(FieldsBuilderEnumInterface::class)) {
×
1028
                $list->insert($app->make(GraphQlItemNormalizer::class), -890);
×
1029
                $list->insert($app->make(GraphQlObjectNormalizer::class), -995);
×
1030
                $list->insert($app->make(GraphQlErrorNormalizer::class), -790);
×
1031
                $list->insert($app->make(GraphQlValidationExceptionNormalizer::class), -780);
×
1032
                $list->insert($app->make(GraphQlHttpExceptionNormalizer::class), -780);
×
1033
                $list->insert($app->make(GraphQlRuntimeExceptionNormalizer::class), -780);
×
1034
            }
1035

1036
            return $list;
×
1037
        });
×
1038

1039
        $this->app->bind(SerializerInterface::class, Serializer::class);
×
1040
        $this->app->bind(NormalizerInterface::class, Serializer::class);
×
1041
        $this->app->singleton(Serializer::class, function (Application $app) {
×
1042
            // TODO: unused + implement hal/jsonapi ?
1043
            // $list->insert($dataUriNormalizer, -920);
1044
            // $list->insert($unwrappingDenormalizer, 1000);
1045
            // $list->insert($jsonserializableNormalizer, -900);
1046
            // $list->insert($uuidDenormalizer, -895); //Todo ramsey uuid support ?
1047

1048
            return new Serializer(
×
1049
                iterator_to_array($app->make('api_platform_normalizer_list')),
×
1050
                [
×
1051
                    new JsonEncoder('json'),
×
1052
                    $app->make(JsonEncoder::class),
×
1053
                    new JsonEncoder('jsonopenapi'),
×
1054
                    new JsonEncoder('jsonapi'),
×
1055
                    new JsonEncoder('jsonhal'),
×
1056
                    new CsvEncoder(),
×
1057
                ]
×
1058
            );
×
1059
        });
×
1060

1061
        $this->app->singleton(JsonLdItemNormalizer::class, function (Application $app) {
×
1062
            $config = $app['config'];
×
1063
            $defaultContext = $config->get('api-platform.serializer', []);
×
1064

1065
            return new JsonLdItemNormalizer(
×
1066
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
1067
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
1068
                $app->make(PropertyMetadataFactoryInterface::class),
×
1069
                $app->make(IriConverterInterface::class),
×
1070
                $app->make(ResourceClassResolverInterface::class),
×
1071
                $app->make(ContextBuilderInterface::class),
×
1072
                $app->make(PropertyAccessorInterface::class),
×
1073
                $app->make(NameConverterInterface::class),
×
1074
                $app->make(ClassMetadataFactoryInterface::class),
×
1075
                $defaultContext,
×
1076
                $app->make(ResourceAccessCheckerInterface::class)
×
1077
            );
×
1078
        });
×
1079

1080
        $this->app->singleton(
×
1081
            ExceptionHandlerInterface::class,
×
1082
            function (Application $app) {
×
1083
                /** @var ConfigRepository */
1084
                $config = $app['config'];
×
1085

1086
                return new ErrorHandler(
×
1087
                    $app,
×
1088
                    $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
1089
                    $app->make(ApiPlatformController::class),
×
1090
                    $app->make(IdentifiersExtractorInterface::class),
×
1091
                    $app->make(ResourceClassResolverInterface::class),
×
1092
                    $app->make(Negotiator::class),
×
1093
                    $config->get('api-platform.exception_to_status'),
×
1094
                    $config->get('app.debug')
×
1095
                );
×
1096
            }
×
1097
        );
×
1098

1099
        $this->app->singleton(InflectorInterface::class, function (Application $app) {
×
1100
            return new Inflector();
×
1101
        });
×
1102

1103
        if ($this->app->runningInConsole()) {
×
1104
            $this->commands([
×
1105
                Console\InstallCommand::class,
×
1106
                Console\Maker\MakeStateProcessorCommand::class,
×
1107
                Console\Maker\MakeStateProviderCommand::class,
×
1108
            ]);
×
1109
        }
1110
    }
1111

1112
    private function registerGraphQl(Application $app): void
1113
    {
1114
        $this->app->singleton(GraphQlItemNormalizer::class, function (Application $app) {
×
1115
            return new GraphQlItemNormalizer(
×
1116
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
1117
                $app->make(PropertyMetadataFactoryInterface::class),
×
1118
                $app->make(IriConverterInterface::class),
×
1119
                $app->make(IdentifiersExtractorInterface::class),
×
1120
                $app->make(ResourceClassResolverInterface::class),
×
1121
                $app->make(PropertyAccessorInterface::class),
×
1122
                $app->make(NameConverterInterface::class),
×
1123
                $app->make(SerializerClassMetadataFactory::class),
×
1124
                null,
×
1125
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
1126
                $app->make(ResourceAccessCheckerInterface::class)
×
1127
            );
×
1128
        });
×
1129

1130
        $this->app->singleton(GraphQlObjectNormalizer::class, function (Application $app) {
×
1131
            return new GraphQlObjectNormalizer(
×
1132
                $app->make(ObjectNormalizer::class),
×
1133
                $app->make(IriConverterInterface::class),
×
1134
                $app->make(IdentifiersExtractorInterface::class),
×
1135
            );
×
1136
        });
×
1137

1138
        $this->app->singleton(GraphQlErrorNormalizer::class, function () {
×
1139
            return new GraphQlErrorNormalizer();
×
1140
        });
×
1141

1142
        $this->app->singleton(GraphQlValidationExceptionNormalizer::class, function (Application $app) {
×
1143
            /** @var ConfigRepository */
1144
            $config = $app['config'];
×
1145

1146
            return new GraphQlValidationExceptionNormalizer($config->get('api-platform.exception_to_status'));
×
1147
        });
×
1148

1149
        $this->app->singleton(GraphQlHttpExceptionNormalizer::class, function () {
×
1150
            return new GraphQlHttpExceptionNormalizer();
×
1151
        });
×
1152

1153
        $this->app->singleton(GraphQlRuntimeExceptionNormalizer::class, function () {
×
1154
            return new GraphQlHttpExceptionNormalizer();
×
1155
        });
×
1156

1157
        $app->singleton('api_platform.graphql.type_locator', function (Application $app) {
×
1158
            $tagged = iterator_to_array($app->tagged('api_platform.graphql.type'));
×
1159
            $services = [];
×
1160
            foreach ($tagged as $service) {
×
1161
                $services[$service->name] = $service;
×
1162
            }
1163

1164
            return new ServiceLocator($services);
×
1165
        });
×
1166

1167
        $app->singleton(TypesFactoryInterface::class, function (Application $app) {
×
1168
            $tagged = iterator_to_array($app->tagged('api_platform.graphql.type'));
×
1169

1170
            return new TypesFactory($app->make('api_platform.graphql.type_locator'), array_column($tagged, 'name'));
×
1171
        });
×
1172
        $app->singleton(TypesContainerInterface::class, function () {
×
1173
            return new TypesContainer();
×
1174
        });
×
1175

1176
        $app->singleton(ResourceFieldResolver::class, function (Application $app) {
×
1177
            return new ResourceFieldResolver($app->make(IriConverterInterface::class));
×
1178
        });
×
1179

1180
        $app->singleton(ContextAwareTypeBuilderInterface::class, function (Application $app) {
×
1181
            return new TypeBuilder(
×
1182
                $app->make(TypesContainerInterface::class),
×
1183
                $app->make(ResourceFieldResolver::class),
×
1184
                null,
×
1185
                $app->make(Pagination::class)
×
1186
            );
×
1187
        });
×
1188

1189
        $app->singleton(TypeConverterInterface::class, function (Application $app) {
×
1190
            return new TypeConverter(
×
1191
                $app->make(ContextAwareTypeBuilderInterface::class),
×
1192
                $app->make(TypesContainerInterface::class),
×
1193
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
1194
                $app->make(PropertyMetadataFactoryInterface::class),
×
1195
            );
×
1196
        });
×
1197

1198
        $app->singleton(GraphQlSerializerContextBuilder::class, function (Application $app) {
×
1199
            return new GraphQlSerializerContextBuilder($app->make(NameConverterInterface::class));
×
1200
        });
×
1201

1202
        $app->singleton(GraphQlReadProvider::class, function (Application $app) {
×
1203
            /** @var ConfigRepository */
1204
            $config = $app['config'];
×
1205

1206
            return new GraphQlReadProvider(
×
1207
                $this->app->make(CallableProvider::class),
×
1208
                $app->make(IriConverterInterface::class),
×
1209
                $app->make(GraphQlSerializerContextBuilder::class),
×
1210
                $config->get('api-platform.graphql.nesting_separator') ?? '__'
×
1211
            );
×
1212
        });
×
1213
        $app->alias(GraphQlReadProvider::class, 'api_platform.graphql.state_provider.read');
×
1214

1215
        $app->singleton(ResolverProvider::class, function (Application $app) {
×
1216
            $resolvers = iterator_to_array($app->tagged('api_platform.graphql.resolver'));
×
1217
            $taggedItemResolvers = iterator_to_array($app->tagged(QueryItemResolverInterface::class));
×
1218
            $taggedCollectionResolvers = iterator_to_array($app->tagged(QueryCollectionResolverInterface::class));
×
1219

1220
            return new ResolverProvider(
×
1221
                $app->make(GraphQlReadProvider::class),
×
1222
                new ServiceLocator([...$resolvers, ...$taggedItemResolvers, ...$taggedCollectionResolvers]),
×
1223
            );
×
1224
        });
×
1225

1226
        $app->alias(ResolverProvider::class, 'api_platform.graphql.state_provider.resolver');
×
1227

1228
        $app->singleton(GraphQlDenormalizeProvider::class, function (Application $app) {
×
1229
            return new GraphQlDenormalizeProvider(
×
1230
                $this->app->make(ResolverProvider::class),
×
1231
                $app->make(SerializerInterface::class),
×
1232
                $app->make(GraphQlSerializerContextBuilder::class)
×
1233
            );
×
1234
        });
×
1235

1236
        $app->alias(GraphQlDenormalizeProvider::class, 'api_platform.graphql.state_provider.denormalize');
×
1237

1238
        $app->singleton('api_platform.graphql.state_provider.parameter', function (Application $app) {
×
1239
            $tagged = iterator_to_array($app->tagged(ParameterProviderInterface::class));
×
1240
            $tagged['api_platform.serializer.filter_parameter_provider'] = $app->make(SerializerFilterParameterProvider::class);
×
1241

1242
            return new ParameterProvider(
×
1243
                new ParameterValidatorProvider(
×
1244
                    new SecurityParameterProvider(
×
1245
                        $app->make(GraphQlDenormalizeProvider::class),
×
1246
                        $app->make(ResourceAccessCheckerInterface::class)
×
1247
                    ),
×
1248
                ),
×
1249
                new ServiceLocator($tagged)
×
1250
            );
×
1251
        });
×
1252

1253
        $app->singleton('api_platform.graphql.state_provider.access_checker', function (Application $app) {
×
1254
            return new AccessCheckerProvider($app->make('api_platform.graphql.state_provider.parameter'), $app->make(ResourceAccessCheckerInterface::class));
×
1255
        });
×
1256

1257
        $app->singleton(NormalizeProcessor::class, function (Application $app) {
×
1258
            return new NormalizeProcessor(
×
1259
                $app->make(SerializerInterface::class),
×
1260
                $app->make(GraphQlSerializerContextBuilder::class),
×
1261
                $app->make(Pagination::class)
×
1262
            );
×
1263
        });
×
1264
        $app->alias(NormalizeProcessor::class, 'api_platform.graphql.state_processor.normalize');
×
1265

1266
        $app->singleton('api_platform.graphql.state_processor', function (Application $app) {
×
1267
            return new WriteProcessor(
×
1268
                $app->make('api_platform.graphql.state_processor.normalize'),
×
1269
                $app->make(CallableProcessor::class),
×
1270
            );
×
1271
        });
×
1272

1273
        $app->singleton(ResolverFactoryInterface::class, function (Application $app) {
×
1274
            return new ResolverFactory(
×
1275
                $app->make('api_platform.graphql.state_provider.access_checker'),
×
1276
                $app->make('api_platform.graphql.state_processor')
×
1277
            );
×
1278
        });
×
1279

1280
        $app->singleton(FieldsBuilderEnumInterface::class, function (Application $app) {
×
1281
            /** @var ConfigRepository */
1282
            $config = $app['config'];
×
1283

1284
            return new FieldsBuilder(
×
1285
                $app->make(PropertyNameCollectionFactoryInterface::class),
×
1286
                $app->make(PropertyMetadataFactoryInterface::class),
×
1287
                $app->make(ResourceMetadataCollectionFactoryInterface::class),
×
1288
                $app->make(ResourceClassResolverInterface::class),
×
1289
                $app->make(TypesContainerInterface::class),
×
1290
                $app->make(ContextAwareTypeBuilderInterface::class),
×
1291
                $app->make(TypeConverterInterface::class),
×
1292
                $app->make(ResolverFactoryInterface::class),
×
1293
                $app->make('filters'),
×
1294
                $app->make(Pagination::class),
×
1295
                $app->make(NameConverterInterface::class),
×
1296
                $config->get('api-platform.graphql.nesting_separator') ?? '__',
×
1297
                $app->make(InflectorInterface::class)
×
1298
            );
×
1299
        });
×
1300

1301
        $app->singleton(SchemaBuilderInterface::class, function (Application $app) {
×
1302
            return new SchemaBuilder($app->make(ResourceNameCollectionFactoryInterface::class), $app->make(ResourceMetadataCollectionFactoryInterface::class), $app->make(TypesFactoryInterface::class), $app->make(TypesContainerInterface::class), $app->make(FieldsBuilderEnumInterface::class));
×
1303
        });
×
1304

1305
        $app->singleton(ErrorHandlerInterface::class, function () {
×
1306
            return new GraphQlErrorHandler();
×
1307
        });
×
1308

1309
        $app->singleton(ExecutorInterface::class, function (Application $app) {
×
1310
            /** @var ConfigRepository */
1311
            $config = $app['config'];
×
1312

1313
            return new Executor($config->get('api-platform.graphql.introspection.enabled') ?? false);
×
1314
        });
×
1315

1316
        $app->singleton(GraphiQlController::class, function (Application $app) {
×
1317
            /** @var ConfigRepository */
1318
            $config = $app['config'];
×
1319
            $prefix = $config->get('api-platform.defaults.route_prefix') ?? '';
×
1320

1321
            return new GraphiQlController($prefix);
×
1322
        });
×
1323

1324
        $app->singleton(GraphQlEntrypointController::class, function (Application $app) {
×
1325
            /** @var ConfigRepository */
1326
            $config = $app['config'];
×
1327

1328
            return new GraphQlEntrypointController(
×
1329
                $app->make(SchemaBuilderInterface::class),
×
1330
                $app->make(ExecutorInterface::class),
×
1331
                $app->make(GraphiQlController::class),
×
1332
                $app->make(SerializerInterface::class),
×
1333
                $app->make(ErrorHandlerInterface::class),
×
1334
                debug: $config->get('app.debug'),
×
1335
                negotiator: $app->make(Negotiator::class),
×
1336
                formats: $config->get('api-platform.formats')
×
1337
            );
×
1338
        });
×
1339
    }
1340

1341
    /**
1342
     * Bootstrap services.
1343
     */
1344
    public function boot(): void
1345
    {
1346
        if ($this->app->runningInConsole()) {
×
1347
            $this->publishes([
×
1348
                __DIR__.'/config/api-platform.php' => $this->app->configPath('api-platform.php'),
×
1349
            ], 'api-platform-config');
×
1350

1351
            $this->publishes([
×
1352
                __DIR__.'/public' => $this->app->publicPath('vendor/api-platform'),
×
1353
            ], ['api-platform-assets', 'public']);
×
1354
        }
1355

1356
        $this->loadViewsFrom(__DIR__.'/resources/views', 'api-platform');
×
1357

1358
        $config = $this->app['config'];
×
1359

1360
        if ($config->get('api-platform.graphql.enabled')) {
×
1361
            $fieldsBuilder = $this->app->make(FieldsBuilderEnumInterface::class);
×
1362
            $typeBuilder = $this->app->make(ContextAwareTypeBuilderInterface::class);
×
1363
            $typeBuilder->setFieldsBuilderLocator(new ServiceLocator(['api_platform.graphql.fields_builder' => $fieldsBuilder]));
×
1364
        }
1365

1366
        $this->loadRoutesFrom(__DIR__.'/routes/api.php');
×
1367
    }
1368
}
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