Completed
Pull Request — 2.x (#2202)
by Christian
04:14
created

FOSRestExtension::loadSerializer()   B

Complexity

Conditions 6
Paths 18

Size

Total Lines 23

Duplication

Lines 12
Ratio 52.17 %

Code Coverage

Tests 9
CRAP Score 8.304

Importance

Changes 0
Metric Value
dl 12
loc 23
ccs 9
cts 15
cp 0.6
rs 8.9297
c 0
b 0
f 0
cc 6
nc 18
nop 2
crap 8.304
1
<?php
2
3
/*
4
 * This file is part of the FOSRestBundle package.
5
 *
6
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.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
namespace FOS\RestBundle\DependencyInjection;
13
14
use FOS\RestBundle\ErrorRenderer\SerializerErrorRenderer;
15
use FOS\RestBundle\EventListener\ResponseStatusCodeListener;
16
use FOS\RestBundle\Inflector\DoctrineInflector;
17
use Symfony\Component\Config\FileLocator;
18
use Symfony\Component\DependencyInjection\Alias;
19
use Symfony\Component\DependencyInjection\ChildDefinition;
20
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
21
use Symfony\Component\DependencyInjection\ContainerBuilder;
22
use Symfony\Component\DependencyInjection\ContainerInterface;
23
use Symfony\Component\DependencyInjection\Definition;
24
use Symfony\Component\DependencyInjection\DefinitionDecorator;
25
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
26
use Symfony\Component\DependencyInjection\Reference;
27
use Symfony\Component\Form\AbstractType;
28
use Symfony\Component\Form\Extension\Core\Type\FormType;
29
use Symfony\Component\HttpFoundation\Response;
30
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
31
use Symfony\Component\HttpKernel\EventListener\ErrorListener;
32
use Symfony\Component\HttpKernel\EventListener\ExceptionListener as LegacyHttpKernelExceptionListener;
33
use Symfony\Component\Validator\Constraint;
34
35
/**
36
 * @internal since 2.8
37
 */
38
class FOSRestExtension extends Extension
39
{
40
    /**
41
     * {@inheritdoc}
42
     */
43 23
    public function getConfiguration(array $config, ContainerBuilder $container)
44
    {
45 23
        return new Configuration($container->getParameter('kernel.debug'));
46
    }
47
48 72
    public function load(array $configs, ContainerBuilder $container)
49
    {
50 72
        $configuration = new Configuration($container->getParameter('kernel.debug'));
51 72
        $config = $this->processConfiguration($configuration, $configs);
52
53 67
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
54 67
        $loader->load('view.xml');
55 67
        $loader->load('request.xml');
56 67
        $loader->load('serializer.xml');
57
58 67
        $container->register('fos_rest.inflector.doctrine', DoctrineInflector::class)
59 67
            ->setDeprecated(true, 'The %service_id% service is deprecated since FOSRestBundle 2.8.')
60 67
            ->setPublic(false);
61
62 67
        if ($config['routing_loader']['enabled']) {
63 6
            $loader->load('routing.xml');
64
65 6
            $restRouteLoader = $container->getDefinition('fos_rest.routing.loader.controller');
66 6
            $restRouteLoader->addArgument(new Reference('controller_name_converter', ContainerInterface::NULL_ON_INVALID_REFERENCE));
67 6
            $restRouteLoader->addArgument(new Reference('fos_rest.routing.loader.reader.controller'));
68 6
            $restRouteLoader->addArgument($config['routing_loader']['default_format']);
69
70 6
            $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
71 6
            $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
72
73 6
            $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
74 6
            $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
75 6
            $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(3, $config['routing_loader']['include_format']);
76 6
            $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(5, $config['routing_loader']['prefix_methods']);
77
        }
78
79 67
        foreach ($config['service'] as $key => $service) {
80 67
            if ('validator' === $service && empty($config['body_converter']['validate'])) {
81 64
                continue;
82
            }
83
84 67
            if (null !== $service) {
85 67
                if ('view_handler' === $key) {
86 67
                    $container->setAlias('fos_rest.'.$key, new Alias($service, true));
87 67
                } elseif('templating' === $key) {
88 67
                    $alias = new Alias($service);
89
90 67
                    if (method_exists($alias, 'setDeprecated')) {
91 67
                        $alias->setDeprecated(true, 'The "%alias_id%" service alias is deprecated since FOSRestBundle 2.8.');
92
                    }
93
94 67
                    $container->setAlias('fos_rest.'.$key, $alias);
95
                } else {
96 67
                    $container->setAlias('fos_rest.'.$key, $service);
97
                }
98
            }
99
        }
100
101 67
        $this->loadForm($config, $loader, $container);
102 67
        $this->loadException($config, $loader, $container);
103 67
        $this->loadBodyConverter($config, $loader, $container);
104 67
        $this->loadView($config, $loader, $container);
105
106 67
        $this->loadBodyListener($config, $loader, $container);
107 67
        $this->loadFormatListener($config, $loader, $container);
108 67
        $this->loadVersioning($config, $loader, $container);
109 67
        $this->loadParamFetcherListener($config, $loader, $container);
110 67
        $this->loadAllowedMethodsListener($config, $loader, $container);
111 67
        $this->loadAccessDeniedListener($config, $loader, $container);
112 67
        $this->loadZoneMatcherListener($config, $loader, $container);
113
114
        // Needs RequestBodyParamConverter and View Handler loaded.
115 67
        $this->loadSerializer($config, $container);
116 67
    }
117
118 67
    private function loadForm(array $config, XmlFileLoader $loader, ContainerBuilder $container)
119
    {
120 67
        if (!empty($config['disable_csrf_role'])) {
121 2
            $loader->load('forms.xml');
122
123 2
            $definition = $container->getDefinition('fos_rest.form.extension.csrf_disable');
124 2
            $definition->replaceArgument(1, $config['disable_csrf_role']);
125
126
            // BC for Symfony < 2.8: the extended_type attribute is used on higher versions
127 2
            if (!method_exists(AbstractType::class, 'getBlockPrefix')) {
128
                $definition->addTag('form.type_extension', ['alias' => 'form']);
129
            } else {
130 2
                $definition->addTag('form.type_extension', ['extended_type' => FormType::class]);
131
            }
132
        }
133 67
    }
134
135 67
    private function loadAccessDeniedListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
136
    {
137 67
        if ($config['access_denied_listener']['enabled'] && !empty($config['access_denied_listener']['formats'])) {
138
            $loader->load('access_denied_listener.xml');
139
140
            $service = $container->getDefinition('fos_rest.access_denied_listener');
141
142
            if (!empty($config['access_denied_listener']['service'])) {
143
                $service->clearTag('kernel.event_subscriber');
144
            }
145
146
            $service->replaceArgument(0, $config['access_denied_listener']['formats']);
147
            $service->replaceArgument(1, $config['unauthorized_challenge']);
148
        }
149 67
    }
150
151 67
    private function loadAllowedMethodsListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
152
    {
153 67
        if ($config['allowed_methods_listener']['enabled']) {
154 3
            if (!empty($config['allowed_methods_listener']['service'])) {
155
                $service = $container->getDefinition('fos_rest.allowed_methods_listener');
156
                $service->clearTag('kernel.event_listener');
157
            }
158
159 3
            $loader->load('allowed_methods_listener.xml');
160
161 3
            $container->getDefinition('fos_rest.allowed_methods_loader')->replaceArgument(1, $config['cache_dir']);
162
        }
163 67
    }
164
165 67
    private function loadBodyListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
166
    {
167 67
        if ($config['body_listener']['enabled']) {
168 14
            $loader->load('body_listener.xml');
169
170 14
            $service = $container->getDefinition('fos_rest.body_listener');
171
172 14
            if (!empty($config['body_listener']['service'])) {
173
                $service->clearTag('kernel.event_listener');
174
            }
175
176 14
            $service->replaceArgument(1, $config['body_listener']['throw_exception_on_unsupported_content_type']);
177 14
            $service->addMethodCall('setDefaultFormat', array($config['body_listener']['default_format']));
178
179 14
            $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(1, $config['body_listener']['decoders']);
180
181 14
            if (class_exists(ServiceLocatorTagPass::class)) {
182 14
                $decoderServicesMap = array();
183
184 14
                foreach ($config['body_listener']['decoders'] as $id) {
185 14
                    $decoderServicesMap[$id] = new Reference($id);
186
                }
187
188 14
                $decodersServiceLocator = ServiceLocatorTagPass::register($container, $decoderServicesMap);
189 14
                $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(0, $decodersServiceLocator);
190
            }
191
192 14
            $arrayNormalizer = $config['body_listener']['array_normalizer'];
193
194 14
            if (null !== $arrayNormalizer['service']) {
195 3
                $bodyListener = $container->getDefinition('fos_rest.body_listener');
196 3
                $bodyListener->addArgument(new Reference($arrayNormalizer['service']));
197 3
                $bodyListener->addArgument($arrayNormalizer['forms']);
198
            }
199
        }
200 67
    }
201
202 67
    private function loadFormatListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
203
    {
204 67 View Code Duplication
        if ($config['format_listener']['enabled'] && !empty($config['format_listener']['rules'])) {
205 6
            $loader->load('format_listener.xml');
206
207 6
            if (!empty($config['format_listener']['service'])) {
208
                $service = $container->getDefinition('fos_rest.format_listener');
209
                $service->clearTag('kernel.event_listener');
210
            }
211
212 6
            $container->setParameter(
213 6
                'fos_rest.format_listener.rules',
214 6
                $config['format_listener']['rules']
215
            );
216
        }
217 67
    }
218
219 67
    private function loadVersioning(array $config, XmlFileLoader $loader, ContainerBuilder $container)
220
    {
221 67
        if (!empty($config['versioning']['enabled'])) {
222 2
            $loader->load('versioning.xml');
223
224 2
            $versionListener = $container->getDefinition('fos_rest.versioning.listener');
225 2
            $versionListener->replaceArgument(1, $config['versioning']['default_version']);
226
227 2
            $resolvers = [];
228 2 View Code Duplication
            if ($config['versioning']['resolvers']['query']['enabled']) {
229 2
                $resolvers['query'] = $container->getDefinition('fos_rest.versioning.query_parameter_resolver');
230 2
                $resolvers['query']->replaceArgument(0, $config['versioning']['resolvers']['query']['parameter_name']);
231
            }
232 2 View Code Duplication
            if ($config['versioning']['resolvers']['custom_header']['enabled']) {
233 2
                $resolvers['custom_header'] = $container->getDefinition('fos_rest.versioning.header_resolver');
234 2
                $resolvers['custom_header']->replaceArgument(0, $config['versioning']['resolvers']['custom_header']['header_name']);
235
            }
236 2 View Code Duplication
            if ($config['versioning']['resolvers']['media_type']['enabled']) {
237 2
                $resolvers['media_type'] = $container->getDefinition('fos_rest.versioning.media_type_resolver');
238 2
                $resolvers['media_type']->replaceArgument(0, $config['versioning']['resolvers']['media_type']['regex']);
239
            }
240
241 2
            $chainResolver = $container->getDefinition('fos_rest.versioning.chain_resolver');
242 2
            foreach ($config['versioning']['guessing_order'] as $resolver) {
243 2
                if (isset($resolvers[$resolver])) {
244 2
                    $chainResolver->addMethodCall('addResolver', [$resolvers[$resolver]]);
245
                }
246
            }
247
        }
248 67
    }
249
250 67
    private function loadParamFetcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
251
    {
252 67
        if ($config['param_fetcher_listener']['enabled']) {
253 5
            if (!class_exists(Constraint::class)) {
254
                @trigger_error('Enabling the fos_rest.param_fetcher_listener option when the Symfony Validator component is not installed is deprecated since FOSRestBundle 2.6 and will throw an exception in 3.0. Disable the feature or install the symfony/validator package.', E_USER_DEPRECATED);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
255
            }
256
257 5
            $loader->load('param_fetcher_listener.xml');
258
259 5
            if (!empty($config['param_fetcher_listener']['service'])) {
260
                $service = $container->getDefinition('fos_rest.param_fetcher_listener');
261
                $service->clearTag('kernel.event_listener');
262
            }
263
264 5
            if ($config['param_fetcher_listener']['force']) {
265 1
                $container->getDefinition('fos_rest.param_fetcher_listener')->replaceArgument(1, true);
266
            }
267
        }
268 67
    }
269
270 67
    private function loadBodyConverter(array $config, XmlFileLoader $loader, ContainerBuilder $container)
271
    {
272 67
        if (!$this->isConfigEnabled($container, $config['body_converter'])) {
273 60
            return;
274
        }
275
276 7
        $loader->load('request_body_param_converter.xml');
277
278 7
        if (!empty($config['body_converter']['validation_errors_argument'])) {
279 7
            $container->getDefinition('fos_rest.converter.request_body')->replaceArgument(4, $config['body_converter']['validation_errors_argument']);
280
        }
281 7
    }
282
283 67
    private function loadView(array $config, XmlFileLoader $loader, ContainerBuilder $container)
284
    {
285 67
        if (!empty($config['view']['jsonp_handler'])) {
286 1
            $childDefinitionClass = class_exists(ChildDefinition::class) ? ChildDefinition::class : DefinitionDecorator::class;
287 1
            $handler = new $childDefinitionClass($config['service']['view_handler']);
288 1
            $handler->setPublic(true);
289
290 1
            $jsonpHandler = new Reference('fos_rest.view_handler.jsonp');
291 1
            $handler->addMethodCall('registerHandler', ['jsonp', [$jsonpHandler, 'createResponse']]);
292 1
            $container->setDefinition('fos_rest.view_handler', $handler);
293
294 1
            $container->getDefinition('fos_rest.view_handler.jsonp')->replaceArgument(0, $config['view']['jsonp_handler']['callback_param']);
295
296 1
            if (empty($config['view']['mime_types']['jsonp'])) {
297 1
                $config['view']['mime_types']['jsonp'] = $config['view']['jsonp_handler']['mime_type'];
298
            }
299
        }
300
301 67 View Code Duplication
        if ($config['view']['mime_types']['enabled']) {
302 3
            $loader->load('mime_type_listener.xml');
303
304 3
            if (!empty($config['mime_type_listener']['service'])) {
305
                $service = $container->getDefinition('fos_rest.mime_type_listener');
306
                $service->clearTag('kernel.event_listener');
307
            }
308
309 3
            $container->getDefinition('fos_rest.mime_type_listener')->replaceArgument(0, $config['view']['mime_types']['formats']);
310
        }
311
312 67 View Code Duplication
        if ($config['view']['view_response_listener']['enabled']) {
313 11
            $loader->load('view_response_listener.xml');
314 11
            $service = $container->getDefinition('fos_rest.view_response_listener');
315
316 11
            if (!empty($config['view_response_listener']['service'])) {
317
                $service->clearTag('kernel.event_listener');
318
            }
319
320 11
            $service->replaceArgument(1, $config['view']['view_response_listener']['force']);
321
        }
322
323 67
        $formats = [];
324 67 View Code Duplication
        foreach ($config['view']['formats'] as $format => $enabled) {
325 67
            if ($enabled) {
326 67
                $formats[$format] = false;
327
            }
328
        }
329 67 View Code Duplication
        foreach ($config['view']['templating_formats'] as $format => $enabled) {
330 67
            if ($enabled) {
331 67
                $formats[$format] = true;
332
            }
333
        }
334
335 67
        if ($config['routing_loader']['enabled']) {
336 6
            $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(3, $formats);
337 6
            $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(3, $formats);
338 6
            $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(4, $formats);
339
        }
340
341 67
        foreach ($config['view']['force_redirects'] as $format => $code) {
342 6
            if (true === $code) {
343 6
                $config['view']['force_redirects'][$format] = Response::HTTP_FOUND;
344
            }
345
        }
346
347 67 View Code Duplication
        if (!is_numeric($config['view']['failed_validation'])) {
348
            $config['view']['failed_validation'] = constant(sprintf('%s::%s', Response::class, $config['view']['failed_validation']));
349
        }
350
351 67 View Code Duplication
        if (!is_numeric($config['view']['empty_content'])) {
352
            $config['view']['empty_content'] = constant(sprintf('%s::%s', Response::class, $config['view']['empty_content']));
353
        }
354
355 67
        $defaultViewHandler = $container->getDefinition('fos_rest.view_handler.default');
356
357 67
        if ([] !== $config['view']['force_redirects']) {
358 6
            @trigger_error('Not setting the "fos_rest.view.force_redirects" configuration option to an empty array is deprecated since FOSRestBundle 2.8.', E_USER_DEPRECATED);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
359
        }
360
361 67
        $defaultViewHandler->setArguments([
362 67
            new Reference('fos_rest.router'),
363 67
            new Reference('fos_rest.serializer'),
364 67
            new Reference('fos_rest.templating', ContainerInterface::NULL_ON_INVALID_REFERENCE),
365 67
            new Reference('request_stack'),
366 67
            $formats,
367 67
            $config['view']['failed_validation'],
368 67
            $config['view']['empty_content'],
369 67
            $config['view']['serialize_null'],
370 67
            $config['view']['force_redirects'],
371 67
            $config['view']['default_engine'],
372
            [],
373
            false,
374
        ]);
375 67
    }
376
377 67
    private function loadException(array $config, XmlFileLoader $loader, ContainerBuilder $container)
378
    {
379 67
        if ($config['exception']['enabled']) {
380 64
            $loader->load('exception.xml');
381
382 64
            if ($config['exception']['map_exception_codes']) {
383 1
                $container->register('fos_rest.exception.response_status_code_listener', ResponseStatusCodeListener::class)
384 1
                    ->setArguments([
385 1
                        new Reference('fos_rest.exception.codes_map'),
386
                    ])
387 1
                    ->addTag('kernel.event_subscriber');
388
            }
389
390 64
            if ($config['exception']['exception_listener']) {
391 11
                if (!empty($config['exception']['service'])) {
392
                    $service = $container->getDefinition('fos_rest.exception_listener');
393
                    $service->clearTag('kernel.event_subscriber');
394
                }
395
396 11
                $controller = $config['exception']['exception_controller'] ?? null;
397
398 11
                if (class_exists(ErrorListener::class)) {
399 11
                    $container->register('fos_rest.error_listener', ErrorListener::class)
400 11
                        ->setArguments([
401 11
                            $controller,
402 11
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
403 11
                            '%kernel.debug%',
404
                        ])
405 11
                        ->addTag('monolog.logger', ['channel' => 'request']);
406
                } else {
407
                    $container->register('fos_rest.error_listener', LegacyHttpKernelExceptionListener::class)
408
                        ->setArguments([
409
                            $controller,
410
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
411
                        ])
412
                        ->addTag('monolog.logger', ['channel' => 'request']);
413
                }
414
415 11
                $container->getDefinition('fos_rest.exception.controller')
416 11
                    ->replaceArgument(2, $config['exception']['debug']);
417
            } else {
418 53
                $container->removeDefinition('fos_rest.exception_listener');
419
            }
420
421 64
            $container->getDefinition('fos_rest.exception.codes_map')
422 64
                ->replaceArgument(0, $config['exception']['codes']);
423 64
            $container->getDefinition('fos_rest.exception.messages_map')
424 64
                ->replaceArgument(0, $config['exception']['messages']);
425
426 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
427 64
                ->replaceArgument(1, $config['exception']['debug']);
428 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
429 64
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
430 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
431 64
                ->replaceArgument(1, $config['exception']['debug']);
432 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
433 64
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
434
435 64
            if ($config['exception']['serialize_exceptions']) {
436 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.jms')
437 14
                    ->replaceArgument(1, $config['exception']['debug']);
438 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.symfony')
439 14
                    ->replaceArgument(1, $config['exception']['debug']);
440
            } else {
441 50
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.jms');
442 50
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.symfony');
443
            }
444
445 64
            if ($config['exception']['serializer_error_renderer']) {
446 3
                $format = new Definition();
447 3
                $format->setFactory([SerializerErrorRenderer::class, 'getPreferredFormat']);
448 3
                $format->setArguments([
449 3
                    new Reference('request_stack'),
450
                ]);
451 3
                $debug = new Definition();
452 3
                $debug->setFactory([SerializerErrorRenderer::class, 'isDebug']);
453 3
                $debug->setArguments([
454 3
                    new Reference('request_stack'),
455 3
                    '%kernel.debug%',
456
                ]);
457 3
                $container->register('fos_rest.error_renderer.serializer', SerializerErrorRenderer::class)
458 3
                    ->setArguments([
459 3
                        new Reference('fos_rest.serializer'),
460 3
                        $format,
461 3
                        new Reference('error_renderer.html', ContainerInterface::NULL_ON_INVALID_REFERENCE),
462 3
                        $debug,
463
                    ]);
464 3
                $container->setAlias('error_renderer', 'fos_rest.error_renderer.serializer');
465
            }
466
        }
467 67
    }
468
469 67
    private function loadSerializer(array $config, ContainerBuilder $container)
470
    {
471 67
        $bodyConverter = $container->hasDefinition('fos_rest.converter.request_body') ? $container->getDefinition('fos_rest.converter.request_body') : null;
472 67
        $viewHandler = $container->getDefinition('fos_rest.view_handler.default');
473 67
        $options = array();
474
475 67 View Code Duplication
        if (!empty($config['serializer']['version'])) {
476
            if ($bodyConverter) {
477
                $bodyConverter->replaceArgument(2, $config['serializer']['version']);
478
            }
479
            $options['exclusionStrategyVersion'] = $config['serializer']['version'];
480
        }
481
482 67 View Code Duplication
        if (!empty($config['serializer']['groups'])) {
483
            if ($bodyConverter) {
484
                $bodyConverter->replaceArgument(1, $config['serializer']['groups']);
485
            }
486
            $options['exclusionStrategyGroups'] = $config['serializer']['groups'];
487
        }
488
489 67
        $options['serializeNullStrategy'] = $config['serializer']['serialize_null'];
490 67
        $viewHandler->addArgument($options);
491 67
    }
492
493 67
    private function loadZoneMatcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
494
    {
495 67
        if (!empty($config['zone'])) {
496 1
            $loader->load('zone_matcher_listener.xml');
497 1
            $zoneMatcherListener = $container->getDefinition('fos_rest.zone_matcher_listener');
498
499 1
            foreach ($config['zone'] as $zone) {
500 1
                $matcher = $this->createZoneRequestMatcher(
501 1
                    $container,
502 1
                    $zone['path'],
503 1
                    $zone['host'],
504 1
                    $zone['methods'],
505 1
                    $zone['ips']
506
                );
507
508 1
                $zoneMatcherListener->addMethodCall('addRequestMatcher', array($matcher));
509
            }
510
        }
511 67
    }
512
513 1
    private function createZoneRequestMatcher(ContainerBuilder $container, $path = null, $host = null, $methods = array(), $ip = null)
514
    {
515 1
        if ($methods) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $methods of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
516
            $methods = array_map('strtoupper', (array) $methods);
517
        }
518
519 1
        $serialized = serialize(array($path, $host, $methods, $ip));
520 1
        $id = 'fos_rest.zone_request_matcher.'.md5($serialized).sha1($serialized);
521
522
        // only add arguments that are necessary
523 1
        $arguments = array($path, $host, $methods, $ip);
524 1
        while (count($arguments) > 0 && !end($arguments)) {
525 1
            array_pop($arguments);
526
        }
527
528 1
        $childDefinitionClass = class_exists(ChildDefinition::class) ? ChildDefinition::class : DefinitionDecorator::class;
529
        $container
530 1
            ->setDefinition($id, new $childDefinitionClass('fos_rest.zone_request_matcher'))
531 1
            ->setArguments($arguments)
532
        ;
533
534 1
        return new Reference($id);
535
    }
536
}
537