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

FOSRestExtension::createZoneRequestMatcher()   A

Complexity

Conditions 5
Paths 8

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 5.0144

Importance

Changes 0
Metric Value
dl 0
loc 23
ccs 11
cts 12
cp 0.9167
rs 9.2408
c 0
b 0
f 0
cc 5
nc 8
nop 5
crap 5.0144
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
        if (null === $config['service']['templating'] && [] === $config['view']['force_redirects'] && null === $config['view']['default_engine']) {
363
            $defaultViewHandler->setFactory([ViewHandler::class, 'create']);
364
            $defaultViewHandler->setArguments([
365
                new Reference('fos_rest.router'),
366
                new Reference('fos_rest.serializer'),
367
                new Reference('request_stack'),
368
                $formats,
369
                $config['view']['failed_validation'],
370
                $config['view']['empty_content'],
371
                $config['view']['serialize_null'],
372
            ]);
373
        } else {
374 67
            $defaultViewHandler->setArguments([
375 67
                new Reference('fos_rest.router'),
376 67
                new Reference('fos_rest.serializer'),
377 67
                new Reference('fos_rest.templating', ContainerInterface::NULL_ON_INVALID_REFERENCE),
378 67
                new Reference('request_stack'),
379 67
                $formats,
380 67
                $config['view']['failed_validation'],
381 67
                $config['view']['empty_content'],
382 67
                $config['view']['serialize_null'],
383 67
                $config['view']['force_redirects'],
384 67
                $config['view']['default_engine'],
385
            ]);
386
        }
387 67
    }
388
389 67
    private function loadException(array $config, XmlFileLoader $loader, ContainerBuilder $container)
390
    {
391 67
        if ($config['exception']['enabled']) {
392 64
            $loader->load('exception.xml');
393
394 64
            if ($config['exception']['map_exception_codes']) {
395 1
                $container->register('fos_rest.exception.response_status_code_listener', ResponseStatusCodeListener::class)
396 1
                    ->setArguments([
397 1
                        new Reference('fos_rest.exception.codes_map'),
398
                    ])
399 1
                    ->addTag('kernel.event_subscriber');
400
            }
401
402 64
            if ($config['exception']['exception_listener']) {
403 11
                if (!empty($config['exception']['service'])) {
404
                    $service = $container->getDefinition('fos_rest.exception_listener');
405
                    $service->clearTag('kernel.event_subscriber');
406
                }
407
408 11
                $controller = $config['exception']['exception_controller'] ?? null;
409
410 11
                if (class_exists(ErrorListener::class)) {
411 11
                    $container->register('fos_rest.error_listener', ErrorListener::class)
412 11
                        ->setArguments([
413 11
                            $controller,
414 11
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
415 11
                            '%kernel.debug%',
416
                        ])
417 11
                        ->addTag('monolog.logger', ['channel' => 'request']);
418
                } else {
419
                    $container->register('fos_rest.error_listener', LegacyHttpKernelExceptionListener::class)
420
                        ->setArguments([
421
                            $controller,
422
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
423
                        ])
424
                        ->addTag('monolog.logger', ['channel' => 'request']);
425
                }
426
427 11
                $container->getDefinition('fos_rest.exception.controller')
428 11
                    ->replaceArgument(2, $config['exception']['debug']);
429
            } else {
430 53
                $container->removeDefinition('fos_rest.exception_listener');
431
            }
432
433 64
            $container->getDefinition('fos_rest.exception.codes_map')
434 64
                ->replaceArgument(0, $config['exception']['codes']);
435 64
            $container->getDefinition('fos_rest.exception.messages_map')
436 64
                ->replaceArgument(0, $config['exception']['messages']);
437
438 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
439 64
                ->replaceArgument(1, $config['exception']['debug']);
440 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
441 64
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
442 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
443 64
                ->replaceArgument(1, $config['exception']['debug']);
444 64
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
445 64
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
446
447 64
            if ($config['exception']['serialize_exceptions']) {
448 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.jms')
449 14
                    ->replaceArgument(1, $config['exception']['debug']);
450 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.symfony')
451 14
                    ->replaceArgument(1, $config['exception']['debug']);
452
            } else {
453 50
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.jms');
454 50
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.symfony');
455
            }
456
457 64
            if ($config['exception']['serializer_error_renderer']) {
458 3
                $format = new Definition();
459 3
                $format->setFactory([SerializerErrorRenderer::class, 'getPreferredFormat']);
460 3
                $format->setArguments([
461 3
                    new Reference('request_stack'),
462
                ]);
463 3
                $debug = new Definition();
464 3
                $debug->setFactory([SerializerErrorRenderer::class, 'isDebug']);
465 3
                $debug->setArguments([
466 3
                    new Reference('request_stack'),
467 3
                    '%kernel.debug%',
468
                ]);
469 3
                $container->register('fos_rest.error_renderer.serializer', SerializerErrorRenderer::class)
470 3
                    ->setArguments([
471 3
                        new Reference('fos_rest.serializer'),
472 3
                        $format,
473 3
                        new Reference('error_renderer.html', ContainerInterface::NULL_ON_INVALID_REFERENCE),
474 3
                        $debug,
475
                    ]);
476 3
                $container->setAlias('error_renderer', 'fos_rest.error_renderer.serializer');
477
            }
478
        }
479 67
    }
480
481 67
    private function loadSerializer(array $config, ContainerBuilder $container)
482
    {
483 67
        $bodyConverter = $container->hasDefinition('fos_rest.converter.request_body') ? $container->getDefinition('fos_rest.converter.request_body') : null;
484 67
        $viewHandler = $container->getDefinition('fos_rest.view_handler.default');
485 67
        $options = array();
486
487 67 View Code Duplication
        if (!empty($config['serializer']['version'])) {
488
            if ($bodyConverter) {
489
                $bodyConverter->replaceArgument(2, $config['serializer']['version']);
490
            }
491
            $options['exclusionStrategyVersion'] = $config['serializer']['version'];
492
        }
493
494 67 View Code Duplication
        if (!empty($config['serializer']['groups'])) {
495
            if ($bodyConverter) {
496
                $bodyConverter->replaceArgument(1, $config['serializer']['groups']);
497
            }
498
            $options['exclusionStrategyGroups'] = $config['serializer']['groups'];
499
        }
500
501 67
        $options['serializeNullStrategy'] = $config['serializer']['serialize_null'];
502 67
        $viewHandler->addArgument($options);
503 67
    }
504
505 67
    private function loadZoneMatcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
506
    {
507 67
        if (!empty($config['zone'])) {
508 1
            $loader->load('zone_matcher_listener.xml');
509 1
            $zoneMatcherListener = $container->getDefinition('fos_rest.zone_matcher_listener');
510
511 1
            foreach ($config['zone'] as $zone) {
512 1
                $matcher = $this->createZoneRequestMatcher(
513 1
                    $container,
514 1
                    $zone['path'],
515 1
                    $zone['host'],
516 1
                    $zone['methods'],
517 1
                    $zone['ips']
518
                );
519
520 1
                $zoneMatcherListener->addMethodCall('addRequestMatcher', array($matcher));
521
            }
522
        }
523 67
    }
524
525 1
    private function createZoneRequestMatcher(ContainerBuilder $container, $path = null, $host = null, $methods = array(), $ip = null)
526
    {
527 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...
528
            $methods = array_map('strtoupper', (array) $methods);
529
        }
530
531 1
        $serialized = serialize(array($path, $host, $methods, $ip));
532 1
        $id = 'fos_rest.zone_request_matcher.'.md5($serialized).sha1($serialized);
533
534
        // only add arguments that are necessary
535 1
        $arguments = array($path, $host, $methods, $ip);
536 1
        while (count($arguments) > 0 && !end($arguments)) {
537 1
            array_pop($arguments);
538
        }
539
540 1
        $childDefinitionClass = class_exists(ChildDefinition::class) ? ChildDefinition::class : DefinitionDecorator::class;
541
        $container
542 1
            ->setDefinition($id, new $childDefinitionClass('fos_rest.zone_request_matcher'))
543 1
            ->setArguments($arguments)
544
        ;
545
546 1
        return new Reference($id);
547
    }
548
}
549