Completed
Pull Request — 2.x (#2152)
by Christian
03:49 queued 01:57
created

FOSRestExtension   F

Complexity

Total Complexity 84

Size/Duplication

Total Lines 461
Duplicated Lines 15.84 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 87.86%

Importance

Changes 0
Metric Value
wmc 84
lcom 1
cbo 9
dl 73
loc 461
ccs 246
cts 280
cp 0.8786
c 0
b 0
f 0
rs 2

15 Methods

Rating   Name   Duplication   Size   Complexity  
A loadForm() 0 16 3
A loadAccessDeniedListener() 0 15 4
A loadAllowedMethodsListener() 0 13 3
B loadBodyListener() 0 36 6
A loadFormatListener() 13 16 4
B loadVersioning() 12 30 7
A loadParamFetcherListener() 0 19 5
A loadBodyConverter() 0 12 3
A getConfiguration() 0 4 1
B load() 0 69 9
F loadView() 36 104 21
A loadException() 0 42 4
B loadSerializer() 12 23 6
A loadZoneMatcherListener() 0 19 3
A createZoneRequestMatcher() 0 23 5

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like FOSRestExtension often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use FOSRestExtension, and based on these observations, apply Extract Interface, too.

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