Completed
Push — 2.x ( 9e1069...8a7994 )
by Christian
04:17 queued 11s
created

FOSRestExtension::loadZoneMatcherListener()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 13
cts 13
cp 1
rs 9.6333
c 0
b 0
f 0
cc 3
nc 3
nop 3
crap 3
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 5
                    $alias = new Alias($service);
90
91 5
                    if (method_exists($alias, 'setDeprecated')) {
92 5
                        $alias->setDeprecated(true, 'The "%alias_id%" service alias is deprecated since FOSRestBundle 2.8.');
93
                    }
94
95 5
                    $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 66
            $loader->load('body_listener.xml');
170
171 66
            $service = $container->getDefinition('fos_rest.body_listener');
172
173 66
            if (!empty($config['body_listener']['service'])) {
174
                $service->clearTag('kernel.event_listener');
175
            }
176
177 66
            $service->replaceArgument(1, $config['body_listener']['throw_exception_on_unsupported_content_type']);
178 66
            $service->addMethodCall('setDefaultFormat', array($config['body_listener']['default_format']));
179
180 66
            $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(1, $config['body_listener']['decoders']);
181
182 66
            if (class_exists(ServiceLocatorTagPass::class)) {
183 66
                $decoderServicesMap = array();
184
185 66
                foreach ($config['body_listener']['decoders'] as $id) {
186 66
                    $decoderServicesMap[$id] = new Reference($id);
187
                }
188
189 66
                $decodersServiceLocator = ServiceLocatorTagPass::register($container, $decoderServicesMap);
190 66
                $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(0, $decodersServiceLocator);
191
            }
192
193 66
            $arrayNormalizer = $config['body_listener']['array_normalizer'];
194
195 66
            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 61
            $defaultViewHandler->setFactory([ViewHandler::class, 'create']);
364 61
            $defaultViewHandler->setArguments([
365 61
                new Reference('fos_rest.router'),
366 61
                new Reference('fos_rest.serializer'),
367 61
                new Reference('request_stack'),
368 61
                $formats,
369 61
                $config['view']['failed_validation'],
370 61
                $config['view']['empty_content'],
371 61
                $config['view']['serialize_null'],
372
            ]);
373
        } else {
374 6
            $defaultViewHandler->setArguments([
375 6
                new Reference('fos_rest.router'),
376 6
                new Reference('fos_rest.serializer'),
377 6
                new Reference('fos_rest.templating', ContainerInterface::NULL_ON_INVALID_REFERENCE),
378 6
                new Reference('request_stack'),
379 6
                $formats,
380 6
                $config['view']['failed_validation'],
381 6
                $config['view']['empty_content'],
382 6
                $config['view']['serialize_null'],
383 6
                $config['view']['force_redirects'],
384 6
                $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_listener.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.serializer', '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