Completed
Push — 2.x ( f16329...65bf5a )
by Christian
16s queued 11s
created

FOSRestExtension::loadForm()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3.0123

Importance

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

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

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

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
255
            }
256
257 5
            $loader->load('param_fetcher_listener.xml');
258
259 5
            if (!empty($config['param_fetcher_listener']['service'])) {
260
                $service = $container->getDefinition('fos_rest.param_fetcher_listener');
261
                $service->clearTag('kernel.event_listener');
262
            }
263
264 5
            if ($config['param_fetcher_listener']['force']) {
265 1
                $container->getDefinition('fos_rest.param_fetcher_listener')->replaceArgument(1, true);
266
            }
267
        }
268 69
    }
269
270 69
    private function loadBodyConverter(array $config, XmlFileLoader $loader, ContainerBuilder $container)
271
    {
272 69
        if (!$this->isConfigEnabled($container, $config['body_converter'])) {
273 62
            return;
274
        }
275
276 7
        $loader->load('request_body_param_converter.xml');
277
278 7
        if (!empty($config['body_converter']['validation_errors_argument'])) {
279 7
            $container->getDefinition('fos_rest.converter.request_body')->replaceArgument(4, $config['body_converter']['validation_errors_argument']);
280
        }
281 7
    }
282
283 69
    private function loadView(array $config, XmlFileLoader $loader, ContainerBuilder $container)
284
    {
285 69
        if (!empty($config['view']['jsonp_handler'])) {
286 1
            $childDefinitionClass = class_exists(ChildDefinition::class) ? ChildDefinition::class : DefinitionDecorator::class;
287 1
            $handler = new $childDefinitionClass($config['service']['view_handler']);
288 1
            $handler->setPublic(true);
289
290 1
            $jsonpHandler = new Reference('fos_rest.view_handler.jsonp');
291 1
            $handler->addMethodCall('registerHandler', ['jsonp', [$jsonpHandler, 'createResponse']]);
292 1
            $container->setDefinition('fos_rest.view_handler', $handler);
293
294 1
            $container->getDefinition('fos_rest.view_handler.jsonp')->replaceArgument(0, $config['view']['jsonp_handler']['callback_param']);
295
296 1
            if (empty($config['view']['mime_types']['jsonp'])) {
297 1
                $config['view']['mime_types']['jsonp'] = $config['view']['jsonp_handler']['mime_type'];
298
            }
299
        }
300
301 69 View Code Duplication
        if ($config['view']['mime_types']['enabled']) {
302 3
            $loader->load('mime_type_listener.xml');
303
304 3
            if (!empty($config['mime_type_listener']['service'])) {
305
                $service = $container->getDefinition('fos_rest.mime_type_listener');
306
                $service->clearTag('kernel.event_listener');
307
            }
308
309 3
            $container->getDefinition('fos_rest.mime_type_listener')->replaceArgument(0, $config['view']['mime_types']['formats']);
310
        }
311
312 69 View Code Duplication
        if ($config['view']['view_response_listener']['enabled']) {
313 11
            $loader->load('view_response_listener.xml');
314 11
            $service = $container->getDefinition('fos_rest.view_response_listener');
315
316 11
            if (!empty($config['view_response_listener']['service'])) {
317
                $service->clearTag('kernel.event_listener');
318
            }
319
320 11
            $service->replaceArgument(1, $config['view']['view_response_listener']['force']);
321
        }
322
323 69
        $formats = [];
324 69 View Code Duplication
        foreach ($config['view']['formats'] as $format => $enabled) {
325 69
            if ($enabled) {
326 69
                $formats[$format] = false;
327
            }
328
        }
329 69 View Code Duplication
        foreach ($config['view']['templating_formats'] as $format => $enabled) {
330 69
            if ($enabled) {
331 69
                $formats[$format] = true;
332
            }
333
        }
334
335 69
        if ($config['routing_loader']['enabled']) {
336 7
            $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(3, $formats);
337 7
            $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(3, $formats);
338 7
            $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(4, $formats);
339
        }
340
341 69
        foreach ($config['view']['force_redirects'] as $format => $code) {
342 69
            if (true === $code) {
343 69
                $config['view']['force_redirects'][$format] = Response::HTTP_FOUND;
344
            }
345
        }
346
347 69 View Code Duplication
        if (!is_numeric($config['view']['failed_validation'])) {
348
            $config['view']['failed_validation'] = constant(sprintf('%s::%s', Response::class, $config['view']['failed_validation']));
349
        }
350
351 69 View Code Duplication
        if (!is_numeric($config['view']['empty_content'])) {
352
            $config['view']['empty_content'] = constant(sprintf('%s::%s', Response::class, $config['view']['empty_content']));
353
        }
354
355 69
        $defaultViewHandler = $container->getDefinition('fos_rest.view_handler.default');
356
357 69
        $defaultViewHandler->setArguments([
358 69
            new Reference($config['service']['router']),
359 69
            new Reference('fos_rest.serializer'),
360 69
            new Reference('fos_rest.templating', ContainerInterface::NULL_ON_INVALID_REFERENCE),
361 69
            new Reference('request_stack'),
362 69
            $formats,
363 69
            $config['view']['failed_validation'],
364 69
            $config['view']['empty_content'],
365 69
            $config['view']['serialize_null'],
366 69
            $config['view']['force_redirects'],
367 69
            $config['view']['default_engine'],
368
            [],
369
            false,
370
        ]);
371 69
    }
372
373 69
    private function loadException(array $config, XmlFileLoader $loader, ContainerBuilder $container)
374
    {
375 69
        if ($config['exception']['enabled']) {
376 65
            $loader->load('exception.xml');
377
378 65
            if ($config['exception']['map_exception_codes']) {
379 1
                $container->register('fos_rest.exception.response_status_code_listener', ResponseStatusCodeListener::class)
380 1
                    ->setArguments([
381 1
                        new Reference('fos_rest.exception.codes_map'),
382
                    ])
383 1
                    ->addTag('kernel.event_subscriber');
384
            }
385
386 65
            if ($config['exception']['exception_listener']) {
387 11
                if (!empty($config['exception']['service'])) {
388
                    $service = $container->getDefinition('fos_rest.exception_listener');
389
                    $service->clearTag('kernel.event_subscriber');
390
                }
391
392 11
                $controller = $config['exception']['exception_controller'] ?? null;
393
394 11
                if (class_exists(ErrorListener::class)) {
395 11
                    $container->register('fos_rest.error_listener', ErrorListener::class)
396 11
                        ->setArguments([
397 11
                            $controller,
398 11
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
399 11
                            '%kernel.debug%',
400
                        ])
401 11
                        ->addTag('monolog.logger', ['channel' => 'request']);
402
                } else {
403
                    $container->register('fos_rest.error_listener', LegacyHttpKernelExceptionListener::class)
404
                        ->setArguments([
405
                            $controller,
406
                            new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE),
407
                        ])
408
                        ->addTag('monolog.logger', ['channel' => 'request']);
409
                }
410
411 11
                $container->getDefinition('fos_rest.exception.controller')
412 11
                    ->replaceArgument(2, $config['exception']['debug']);
413
            } else {
414 54
                $container->removeDefinition('fos_rest.exception_listener');
415
            }
416
417 65
            $container->getDefinition('fos_rest.exception.codes_map')
418 65
                ->replaceArgument(0, $config['exception']['codes']);
419 65
            $container->getDefinition('fos_rest.exception.messages_map')
420 65
                ->replaceArgument(0, $config['exception']['messages']);
421
422 65
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
423 65
                ->replaceArgument(1, $config['exception']['debug']);
424 65
            $container->getDefinition('fos_rest.serializer.flatten_exception_handler')
425 65
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
426 65
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
427 65
                ->replaceArgument(1, $config['exception']['debug']);
428 65
            $container->getDefinition('fos_rest.serializer.flatten_exception_normalizer')
429 65
                ->replaceArgument(2, 'rfc7807' === $config['exception']['flatten_exception_format']);
430
431 65
            if ($config['exception']['serialize_exceptions']) {
432 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.jms')
433 14
                    ->replaceArgument(1, $config['exception']['debug']);
434 14
                $container->getDefinition('fos_rest.serializer.exception_normalizer.symfony')
435 14
                    ->replaceArgument(1, $config['exception']['debug']);
436
            } else {
437 51
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.jms');
438 51
                $container->removeDefinition('fos_rest.serializer.exception_normalizer.symfony');
439
            }
440
441 65
            if ($config['exception']['serializer_error_renderer']) {
442 3
                $format = new Definition();
443 3
                $format->setFactory([SerializerErrorRenderer::class, 'getPreferredFormat']);
444 3
                $format->setArguments([
445 3
                    new Reference('request_stack'),
446
                ]);
447 3
                $debug = new Definition();
448 3
                $debug->setFactory([SerializerErrorRenderer::class, 'isDebug']);
449 3
                $debug->setArguments([
450 3
                    new Reference('request_stack'),
451 3
                    '%kernel.debug%',
452
                ]);
453 3
                $container->register('fos_rest.error_renderer.serializer', SerializerErrorRenderer::class)
454 3
                    ->setArguments([
455 3
                        new Reference('fos_rest.serializer'),
456 3
                        $format,
457 3
                        new Reference('error_renderer.html', ContainerInterface::NULL_ON_INVALID_REFERENCE),
458 3
                        $debug,
459
                    ]);
460 3
                $container->setAlias('error_renderer', 'fos_rest.error_renderer.serializer');
461
            }
462
        }
463 69
    }
464
465 69
    private function loadSerializer(array $config, ContainerBuilder $container)
466
    {
467 69
        $bodyConverter = $container->hasDefinition('fos_rest.converter.request_body') ? $container->getDefinition('fos_rest.converter.request_body') : null;
468 69
        $viewHandler = $container->getDefinition('fos_rest.view_handler.default');
469 69
        $options = array();
470
471 69 View Code Duplication
        if (!empty($config['serializer']['version'])) {
472 1
            if ($bodyConverter) {
473
                $bodyConverter->replaceArgument(2, $config['serializer']['version']);
474
            }
475 1
            $options['exclusionStrategyVersion'] = $config['serializer']['version'];
476
        }
477
478 69 View Code Duplication
        if (!empty($config['serializer']['groups'])) {
479 1
            if ($bodyConverter) {
480
                $bodyConverter->replaceArgument(1, $config['serializer']['groups']);
481
            }
482 1
            $options['exclusionStrategyGroups'] = $config['serializer']['groups'];
483
        }
484
485 69
        $options['serializeNullStrategy'] = $config['serializer']['serialize_null'];
486 69
        $viewHandler->replaceArgument(10, $options);
487 69
    }
488
489 69
    private function loadZoneMatcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
490
    {
491 69
        if (!empty($config['zone'])) {
492 1
            $loader->load('zone_matcher_listener.xml');
493 1
            $zoneMatcherListener = $container->getDefinition('fos_rest.zone_matcher_listener');
494
495 1
            foreach ($config['zone'] as $zone) {
496 1
                $matcher = $this->createZoneRequestMatcher(
497 1
                    $container,
498 1
                    $zone['path'],
499 1
                    $zone['host'],
500 1
                    $zone['methods'],
501 1
                    $zone['ips']
502
                );
503
504 1
                $zoneMatcherListener->addMethodCall('addRequestMatcher', array($matcher));
505
            }
506
        }
507 69
    }
508
509 1
    private function createZoneRequestMatcher(ContainerBuilder $container, $path = null, $host = null, $methods = array(), $ip = null)
510
    {
511 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...
512
            $methods = array_map('strtoupper', (array) $methods);
513
        }
514
515 1
        $serialized = serialize(array($path, $host, $methods, $ip));
516 1
        $id = 'fos_rest.zone_request_matcher.'.md5($serialized).sha1($serialized);
517
518
        // only add arguments that are necessary
519 1
        $arguments = array($path, $host, $methods, $ip);
520 1
        while (count($arguments) > 0 && !end($arguments)) {
521 1
            array_pop($arguments);
522
        }
523
524 1
        $childDefinitionClass = class_exists(ChildDefinition::class) ? ChildDefinition::class : DefinitionDecorator::class;
525
        $container
526 1
            ->setDefinition($id, new $childDefinitionClass('fos_rest.zone_request_matcher'))
527 1
            ->setArguments($arguments)
528
        ;
529
530 1
        return new Reference($id);
531
    }
532
}
533