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

FOSRestExtension::load()   B

Complexity

Conditions 9
Paths 14

Size

Total Lines 69

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 47
CRAP Score 9

Importance

Changes 0
Metric Value
dl 0
loc 69
ccs 47
cts 47
cp 1
c 0
b 0
f 0
rs 7.1208
cc 9
nc 14
nop 2
crap 9

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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 FOS\RestBundle\View\ViewHandler;
18
use Symfony\Component\Config\FileLocator;
19
use Symfony\Component\DependencyInjection\Alias;
20
use Symfony\Component\DependencyInjection\ChildDefinition;
21
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
22
use Symfony\Component\DependencyInjection\ContainerBuilder;
23
use Symfony\Component\DependencyInjection\ContainerInterface;
24
use Symfony\Component\DependencyInjection\Definition;
25
use Symfony\Component\DependencyInjection\DefinitionDecorator;
26
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
27
use Symfony\Component\DependencyInjection\Reference;
28
use Symfony\Component\Form\AbstractType;
29
use Symfony\Component\Form\Extension\Core\Type\FormType;
30
use Symfony\Component\HttpFoundation\Response;
31
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
32
use Symfony\Component\HttpKernel\EventListener\ErrorListener;
33
use Symfony\Component\HttpKernel\EventListener\ExceptionListener as LegacyHttpKernelExceptionListener;
34
use Symfony\Component\Validator\Constraint;
35
36
/**
37
 * @internal since 2.8
38
 */
39
class FOSRestExtension extends Extension
40
{
41
    /**
42
     * {@inheritdoc}
43
     */
44 23
    public function getConfiguration(array $config, ContainerBuilder $container)
45
    {
46 23
        return new Configuration($container->getParameter('kernel.debug'));
47
    }
48
49 72
    public function load(array $configs, ContainerBuilder $container)
50
    {
51 72
        $configuration = new Configuration($container->getParameter('kernel.debug'));
52 72
        $config = $this->processConfiguration($configuration, $configs);
53
54 67
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
55 67
        $loader->load('view.xml');
56 67
        $loader->load('request.xml');
57 67
        $loader->load('serializer.xml');
58
59 67
        $container->register('fos_rest.inflector.doctrine', DoctrineInflector::class)
60 67
            ->setDeprecated(true, 'The %service_id% service is deprecated since FOSRestBundle 2.8.')
61 67
            ->setPublic(false);
62
63 67
        if ($config['routing_loader']['enabled']) {
64 6
            $loader->load('routing.xml');
65
66 6
            $restRouteLoader = $container->getDefinition('fos_rest.routing.loader.controller');
67 6
            $restRouteLoader->addArgument(new Reference('controller_name_converter', ContainerInterface::NULL_ON_INVALID_REFERENCE));
68 6
            $restRouteLoader->addArgument(new Reference('fos_rest.routing.loader.reader.controller'));
69 6
            $restRouteLoader->addArgument($config['routing_loader']['default_format']);
70
71 6
            $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
72 6
            $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
73
74 6
            $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
75 6
            $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
76 6
            $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(3, $config['routing_loader']['include_format']);
77 6
            $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(5, $config['routing_loader']['prefix_methods']);
78
        }
79
80 67
        foreach ($config['service'] as $key => $service) {
81 67
            if ('validator' === $service && empty($config['body_converter']['validate'])) {
82 64
                continue;
83
            }
84
85 67
            if (null !== $service) {
86 67
                if ('view_handler' === $key) {
87 67
                    $container->setAlias('fos_rest.'.$key, new Alias($service, true));
88 67
                } elseif('templating' === $key) {
89 67
                    $alias = new Alias($service);
90
91 67
                    if (method_exists($alias, 'setDeprecated')) {
92 67
                        $alias->setDeprecated(true, 'The "%alias_id%" service alias is deprecated since FOSRestBundle 2.8.');
93
                    }
94
95 67
                    $container->setAlias('fos_rest.'.$key, $alias);
96
                } else {
97 67
                    $container->setAlias('fos_rest.'.$key, $service);
98
                }
99
            }
100
        }
101
102 67
        $this->loadForm($config, $loader, $container);
103 67
        $this->loadException($config, $loader, $container);
104 67
        $this->loadBodyConverter($config, $loader, $container);
105 67
        $this->loadView($config, $loader, $container);
106
107 67
        $this->loadBodyListener($config, $loader, $container);
108 67
        $this->loadFormatListener($config, $loader, $container);
109 67
        $this->loadVersioning($config, $loader, $container);
110 67
        $this->loadParamFetcherListener($config, $loader, $container);
111 67
        $this->loadAllowedMethodsListener($config, $loader, $container);
112 67
        $this->loadAccessDeniedListener($config, $loader, $container);
113 67
        $this->loadZoneMatcherListener($config, $loader, $container);
114
115
        // Needs RequestBodyParamConverter and View Handler loaded.
116 67
        $this->loadSerializer($config, $container);
117 67
    }
118
119 67
    private function loadForm(array $config, XmlFileLoader $loader, ContainerBuilder $container)
120
    {
121 67
        if (!empty($config['disable_csrf_role'])) {
122 2
            $loader->load('forms.xml');
123
124 2
            $definition = $container->getDefinition('fos_rest.form.extension.csrf_disable');
125 2
            $definition->replaceArgument(1, $config['disable_csrf_role']);
126
127
            // BC for Symfony < 2.8: the extended_type attribute is used on higher versions
128 2
            if (!method_exists(AbstractType::class, 'getBlockPrefix')) {
129
                $definition->addTag('form.type_extension', ['alias' => 'form']);
130
            } else {
131 2
                $definition->addTag('form.type_extension', ['extended_type' => FormType::class]);
132
            }
133
        }
134 67
    }
135
136 67
    private function loadAccessDeniedListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
137
    {
138 67
        if ($config['access_denied_listener']['enabled'] && !empty($config['access_denied_listener']['formats'])) {
139
            $loader->load('access_denied_listener.xml');
140
141
            $service = $container->getDefinition('fos_rest.access_denied_listener');
142
143
            if (!empty($config['access_denied_listener']['service'])) {
144
                $service->clearTag('kernel.event_subscriber');
145
            }
146
147
            $service->replaceArgument(0, $config['access_denied_listener']['formats']);
148
            $service->replaceArgument(1, $config['unauthorized_challenge']);
149
        }
150 67
    }
151
152 67
    private function loadAllowedMethodsListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
153
    {
154 67
        if ($config['allowed_methods_listener']['enabled']) {
155 3
            if (!empty($config['allowed_methods_listener']['service'])) {
156
                $service = $container->getDefinition('fos_rest.allowed_methods_listener');
157
                $service->clearTag('kernel.event_listener');
158
            }
159
160 3
            $loader->load('allowed_methods_listener.xml');
161
162 3
            $container->getDefinition('fos_rest.allowed_methods_loader')->replaceArgument(1, $config['cache_dir']);
163
        }
164 67
    }
165
166 67
    private function loadBodyListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
167
    {
168 67
        if ($config['body_listener']['enabled']) {
169 14
            $loader->load('body_listener.xml');
170
171 14
            $service = $container->getDefinition('fos_rest.body_listener');
172
173 14
            if (!empty($config['body_listener']['service'])) {
174
                $service->clearTag('kernel.event_listener');
175
            }
176
177 14
            $service->replaceArgument(1, $config['body_listener']['throw_exception_on_unsupported_content_type']);
178 14
            $service->addMethodCall('setDefaultFormat', array($config['body_listener']['default_format']));
179
180 14
            $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(1, $config['body_listener']['decoders']);
181
182 14
            if (class_exists(ServiceLocatorTagPass::class)) {
183 14
                $decoderServicesMap = array();
184
185 14
                foreach ($config['body_listener']['decoders'] as $id) {
186 14
                    $decoderServicesMap[$id] = new Reference($id);
187
                }
188
189 14
                $decodersServiceLocator = ServiceLocatorTagPass::register($container, $decoderServicesMap);
190 14
                $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(0, $decodersServiceLocator);
191
            }
192
193 14
            $arrayNormalizer = $config['body_listener']['array_normalizer'];
194
195 14
            if (null !== $arrayNormalizer['service']) {
196 3
                $bodyListener = $container->getDefinition('fos_rest.body_listener');
197 3
                $bodyListener->addArgument(new Reference($arrayNormalizer['service']));
198 3
                $bodyListener->addArgument($arrayNormalizer['forms']);
199
            }
200
        }
201 67
    }
202
203 67
    private function loadFormatListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
204
    {
205 67 View Code Duplication
        if ($config['format_listener']['enabled'] && !empty($config['format_listener']['rules'])) {
206 6
            $loader->load('format_listener.xml');
207
208 6
            if (!empty($config['format_listener']['service'])) {
209
                $service = $container->getDefinition('fos_rest.format_listener');
210
                $service->clearTag('kernel.event_listener');
211
            }
212
213 6
            $container->setParameter(
214 6
                'fos_rest.format_listener.rules',
215 6
                $config['format_listener']['rules']
216
            );
217
        }
218 67
    }
219
220 67
    private function loadVersioning(array $config, XmlFileLoader $loader, ContainerBuilder $container)
221
    {
222 67
        if (!empty($config['versioning']['enabled'])) {
223 2
            $loader->load('versioning.xml');
224
225 2
            $versionListener = $container->getDefinition('fos_rest.versioning.listener');
226 2
            $versionListener->replaceArgument(1, $config['versioning']['default_version']);
227
228 2
            $resolvers = [];
229 2 View Code Duplication
            if ($config['versioning']['resolvers']['query']['enabled']) {
230 2
                $resolvers['query'] = $container->getDefinition('fos_rest.versioning.query_parameter_resolver');
231 2
                $resolvers['query']->replaceArgument(0, $config['versioning']['resolvers']['query']['parameter_name']);
232
            }
233 2 View Code Duplication
            if ($config['versioning']['resolvers']['custom_header']['enabled']) {
234 2
                $resolvers['custom_header'] = $container->getDefinition('fos_rest.versioning.header_resolver');
235 2
                $resolvers['custom_header']->replaceArgument(0, $config['versioning']['resolvers']['custom_header']['header_name']);
236
            }
237 2 View Code Duplication
            if ($config['versioning']['resolvers']['media_type']['enabled']) {
238 2
                $resolvers['media_type'] = $container->getDefinition('fos_rest.versioning.media_type_resolver');
239 2
                $resolvers['media_type']->replaceArgument(0, $config['versioning']['resolvers']['media_type']['regex']);
240
            }
241
242 2
            $chainResolver = $container->getDefinition('fos_rest.versioning.chain_resolver');
243 2
            foreach ($config['versioning']['guessing_order'] as $resolver) {
244 2
                if (isset($resolvers[$resolver])) {
245 2
                    $chainResolver->addMethodCall('addResolver', [$resolvers[$resolver]]);
246
                }
247
            }
248
        }
249 67
    }
250
251 67
    private function loadParamFetcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
252
    {
253 67
        if ($config['param_fetcher_listener']['enabled']) {
254 5
            if (!class_exists(Constraint::class)) {
255
                @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...
256
            }
257
258 5
            $loader->load('param_fetcher_listener.xml');
259
260 5
            if (!empty($config['param_fetcher_listener']['service'])) {
261
                $service = $container->getDefinition('fos_rest.param_fetcher_listener');
262
                $service->clearTag('kernel.event_listener');
263
            }
264
265 5
            if ($config['param_fetcher_listener']['force']) {
266 1
                $container->getDefinition('fos_rest.param_fetcher_listener')->replaceArgument(1, true);
267
            }
268
        }
269 67
    }
270
271 67
    private function loadBodyConverter(array $config, XmlFileLoader $loader, ContainerBuilder $container)
272
    {
273 67
        if (!$this->isConfigEnabled($container, $config['body_converter'])) {
274 60
            return;
275
        }
276
277 7
        $loader->load('request_body_param_converter.xml');
278
279 7
        if (!empty($config['body_converter']['validation_errors_argument'])) {
280 7
            $container->getDefinition('fos_rest.converter.request_body')->replaceArgument(4, $config['body_converter']['validation_errors_argument']);
281
        }
282 7
    }
283
284 67
    private function loadView(array $config, XmlFileLoader $loader, ContainerBuilder $container)
285
    {
286 67
        if (!empty($config['view']['jsonp_handler'])) {
287 1
            $childDefinitionClass = class_exists(ChildDefinition::class) ? ChildDefinition::class : DefinitionDecorator::class;
288 1
            $handler = new $childDefinitionClass($config['service']['view_handler']);
289 1
            $handler->setPublic(true);
290
291 1
            $jsonpHandler = new Reference('fos_rest.view_handler.jsonp');
292 1
            $handler->addMethodCall('registerHandler', ['jsonp', [$jsonpHandler, 'createResponse']]);
293 1
            $container->setDefinition('fos_rest.view_handler', $handler);
294
295 1
            $container->getDefinition('fos_rest.view_handler.jsonp')->replaceArgument(0, $config['view']['jsonp_handler']['callback_param']);
296
297 1
            if (empty($config['view']['mime_types']['jsonp'])) {
298 1
                $config['view']['mime_types']['jsonp'] = $config['view']['jsonp_handler']['mime_type'];
299
            }
300
        }
301
302 67 View Code Duplication
        if ($config['view']['mime_types']['enabled']) {
303 3
            $loader->load('mime_type_listener.xml');
304
305 3
            if (!empty($config['mime_type_listener']['service'])) {
306
                $service = $container->getDefinition('fos_rest.mime_type_listener');
307
                $service->clearTag('kernel.event_listener');
308
            }
309
310 3
            $container->getDefinition('fos_rest.mime_type_listener')->replaceArgument(0, $config['view']['mime_types']['formats']);
311
        }
312
313 67 View Code Duplication
        if ($config['view']['view_response_listener']['enabled']) {
314 11
            $loader->load('view_response_listener.xml');
315 11
            $service = $container->getDefinition('fos_rest.view_response_listener');
316
317 11
            if (!empty($config['view_response_listener']['service'])) {
318
                $service->clearTag('kernel.event_listener');
319
            }
320
321 11
            $service->replaceArgument(1, $config['view']['view_response_listener']['force']);
322
        }
323
324 67
        $formats = [];
325 67 View Code Duplication
        foreach ($config['view']['formats'] as $format => $enabled) {
326 67
            if ($enabled) {
327 67
                $formats[$format] = false;
328
            }
329
        }
330 67 View Code Duplication
        foreach ($config['view']['templating_formats'] as $format => $enabled) {
331 67
            if ($enabled) {
332 67
                $formats[$format] = true;
333
            }
334
        }
335
336 67
        if ($config['routing_loader']['enabled']) {
337 6
            $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(3, $formats);
338 6
            $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(3, $formats);
339 6
            $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(4, $formats);
340
        }
341
342 67
        foreach ($config['view']['force_redirects'] as $format => $code) {
343 6
            if (true === $code) {
344 6
                $config['view']['force_redirects'][$format] = Response::HTTP_FOUND;
345
            }
346
        }
347
348 67 View Code Duplication
        if (!is_numeric($config['view']['failed_validation'])) {
349
            $config['view']['failed_validation'] = constant(sprintf('%s::%s', Response::class, $config['view']['failed_validation']));
350
        }
351
352 67 View Code Duplication
        if (!is_numeric($config['view']['empty_content'])) {
353
            $config['view']['empty_content'] = constant(sprintf('%s::%s', Response::class, $config['view']['empty_content']));
354
        }
355
356 67
        $defaultViewHandler = $container->getDefinition('fos_rest.view_handler.default');
357
358 67
        if ([] !== $config['view']['force_redirects']) {
359 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...
360
        }
361
362 67
        $defaultViewHandler->setArguments([
363 67
            new Reference('fos_rest.router'),
364 67
            new Reference('fos_rest.serializer'),
365 67
            new Reference('fos_rest.templating', ContainerInterface::NULL_ON_INVALID_REFERENCE),
366 67
            new Reference('request_stack'),
367 67
            $formats,
368 67
            $config['view']['failed_validation'],
369 67
            $config['view']['empty_content'],
370 67
            $config['view']['serialize_null'],
371 67
            $config['view']['force_redirects'],
372 67
            $config['view']['default_engine'],
373
            [],
374
            false
375
        ]);
376 67
    }
377
378 67
    private function loadException(array $config, XmlFileLoader $loader, ContainerBuilder $container)
379
    {
380 67
        if ($config['exception']['enabled']) {
381 64
            $loader->load('exception.xml');
382
383 64
            if ($config['exception']['map_exception_codes']) {
384 1
                $container->register('fos_rest.exception.response_status_code_listener', ResponseStatusCodeListener::class)
385 1
                    ->setArguments([
386 1
                        new Reference('fos_rest.exception.codes_map'),
387
                    ])
388 1
                    ->addTag('kernel.event_subscriber');
389
            }
390
391 64
            if ($config['exception']['exception_listener']) {
392 11
                if (!empty($config['exception']['service'])) {
393
                    $service = $container->getDefinition('fos_rest.exception_listener');
394
                    $service->clearTag('kernel.event_subscriber');
395
                }
396
397 11
                $controller = $config['exception']['exception_controller'] ?? null;
398
399 11
                if (class_exists(ErrorListener::class)) {
400 11
                    $container->register('fos_rest.error_listener', ErrorListener::class)
401 11
                        ->setArguments([
402 11
                            $controller,
403 11
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
404 11
                            '%kernel.debug%',
405
                        ])
406 11
                        ->addTag('monolog.logger', ['channel' => 'request']);
407
                } else {
408
                    $container->register('fos_rest.error_listener', LegacyHttpKernelExceptionListener::class)
409
                        ->setArguments([
410
                            $controller,
411
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
412
                        ])
413
                        ->addTag('monolog.logger', ['channel' => 'request']);
414
                }
415
416 11
                $container->getDefinition('fos_rest.exception.controller')
417 11
                    ->replaceArgument(2, $config['exception']['debug']);
418
            } else {
419 53
                $container->removeDefinition('fos_rest.exception_listener');
420
            }
421
422 64
            $container->getDefinition('fos_rest.exception.codes_map')
423 64
                ->replaceArgument(0, $config['exception']['codes']);
424 64
            $container->getDefinition('fos_rest.exception.messages_map')
425 64
                ->replaceArgument(0, $config['exception']['messages']);
426
427 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
428 64
                ->replaceArgument(1, $config['exception']['debug']);
429 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
430 64
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
431 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
432 64
                ->replaceArgument(1, $config['exception']['debug']);
433 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
434 64
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
435
436 64
            if ($config['exception']['serialize_exceptions']) {
437 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.jms')
438 14
                    ->replaceArgument(1, $config['exception']['debug']);
439 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.symfony')
440 14
                    ->replaceArgument(1, $config['exception']['debug']);
441
            } else {
442 50
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.jms');
443 50
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.symfony');
444
            }
445
446 64
            if ($config['exception']['serializer_error_renderer']) {
447 3
                $format = new Definition();
448 3
                $format->setFactory([SerializerErrorRenderer::class, 'getPreferredFormat']);
449 3
                $format->setArguments([
450 3
                    new Reference('request_stack'),
451
                ]);
452 3
                $debug = new Definition();
453 3
                $debug->setFactory([SerializerErrorRenderer::class, 'isDebug']);
454 3
                $debug->setArguments([
455 3
                    new Reference('request_stack'),
456 3
                    '%kernel.debug%',
457
                ]);
458 3
                $container->register('fos_rest.error_renderer.serializer', SerializerErrorRenderer::class)
459 3
                    ->setArguments([
460 3
                        new Reference('fos_rest.serializer'),
461 3
                        $format,
462 3
                        new Reference('error_renderer.html', ContainerInterface::NULL_ON_INVALID_REFERENCE),
463 3
                        $debug,
464
                    ]);
465 3
                $container->setAlias('error_renderer', 'fos_rest.error_renderer.serializer');
466
            }
467
        }
468 67
    }
469
470 67
    private function loadSerializer(array $config, ContainerBuilder $container)
471
    {
472 67
        $bodyConverter = $container->hasDefinition('fos_rest.converter.request_body') ? $container->getDefinition('fos_rest.converter.request_body') : null;
473 67
        $viewHandler = $container->getDefinition('fos_rest.view_handler.default');
474 67
        $options = array();
475
476 67 View Code Duplication
        if (!empty($config['serializer']['version'])) {
477
            if ($bodyConverter) {
478
                $bodyConverter->replaceArgument(2, $config['serializer']['version']);
479
            }
480
            $options['exclusionStrategyVersion'] = $config['serializer']['version'];
481
        }
482
483 67 View Code Duplication
        if (!empty($config['serializer']['groups'])) {
484
            if ($bodyConverter) {
485
                $bodyConverter->replaceArgument(1, $config['serializer']['groups']);
486
            }
487
            $options['exclusionStrategyGroups'] = $config['serializer']['groups'];
488
        }
489
490 67
        $options['serializeNullStrategy'] = $config['serializer']['serialize_null'];
491 67
        $viewHandler->addArgument($options);
492 67
    }
493
494 67
    private function loadZoneMatcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
495
    {
496 67
        if (!empty($config['zone'])) {
497 1
            $loader->load('zone_matcher_listener.xml');
498 1
            $zoneMatcherListener = $container->getDefinition('fos_rest.zone_matcher_listener');
499
500 1
            foreach ($config['zone'] as $zone) {
501 1
                $matcher = $this->createZoneRequestMatcher(
502 1
                    $container,
503 1
                    $zone['path'],
504 1
                    $zone['host'],
505 1
                    $zone['methods'],
506 1
                    $zone['ips']
507
                );
508
509 1
                $zoneMatcherListener->addMethodCall('addRequestMatcher', array($matcher));
510
            }
511
        }
512 67
    }
513
514 1
    private function createZoneRequestMatcher(ContainerBuilder $container, $path = null, $host = null, $methods = array(), $ip = null)
515
    {
516 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...
517
            $methods = array_map('strtoupper', (array) $methods);
518
        }
519
520 1
        $serialized = serialize(array($path, $host, $methods, $ip));
521 1
        $id = 'fos_rest.zone_request_matcher.'.md5($serialized).sha1($serialized);
522
523
        // only add arguments that are necessary
524 1
        $arguments = array($path, $host, $methods, $ip);
525 1
        while (count($arguments) > 0 && !end($arguments)) {
526 1
            array_pop($arguments);
527
        }
528
529 1
        $childDefinitionClass = class_exists(ChildDefinition::class) ? ChildDefinition::class : DefinitionDecorator::class;
530
        $container
531 1
            ->setDefinition($id, new $childDefinitionClass('fos_rest.zone_request_matcher'))
532 1
            ->setArguments($arguments)
533
        ;
534
535 1
        return new Reference($id);
536
    }
537
}
538