Completed
Push — master ( 389562...2321f6 )
by Guilh
8s
created

FOSRestExtension   C

Complexity

Total Complexity 77

Size/Duplication

Total Lines 399
Duplicated Lines 22.06 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 85.46%

Importance

Changes 11
Bugs 3 Features 1
Metric Value
wmc 77
c 11
b 3
f 1
lcom 1
cbo 8
dl 88
loc 399
ccs 241
cts 282
cp 0.8546
rs 5.4715

15 Methods

Rating   Name   Duplication   Size   Complexity  
A loadForm() 0 7 2
A loadAccessDeniedListener() 0 15 4
A loadAllowedMethodsListener() 13 13 3
B loadBodyListener() 0 25 4
B loadBodyConverter() 0 18 5
A loadParamFetcherListener() 15 15 4
F loadView() 36 78 15
B load() 0 44 3
B loadFormatListener() 0 20 6
C loadVersioning() 12 30 7
C loadException() 0 34 8
B loadSerializer() 12 21 6
A loadZoneMatcherListener() 0 18 3
B createZoneRequestMatcher() 0 22 4
A testExceptionExists() 0 6 3

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 Symfony\Component\Config\FileLocator;
15
use Symfony\Component\DependencyInjection\ContainerBuilder;
16
use Symfony\Component\DependencyInjection\DefinitionDecorator;
17
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
18
use Symfony\Component\DependencyInjection\Reference;
19
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
20
use Symfony\Component\HttpFoundation\Request;
21
use Symfony\Component\HttpFoundation\Response;
22
23
class FOSRestExtension extends Extension
24
{
25
    /**
26
     * Loads the services based on your application configuration.
27
     *
28
     * @param array            $configs
29
     * @param ContainerBuilder $container
30
     *
31
     * @throws \InvalidArgumentException
32
     * @throws \LogicException
33
     */
34 47
    public function load(array $configs, ContainerBuilder $container)
35
    {
36 47
        $config = $this->processConfiguration(new Configuration(), $configs);
37
38 42
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
39 42
        $loader->load('view.xml');
40 42
        $loader->load('routing.xml');
41 42
        $loader->load('request.xml');
42 42
        $loader->load('serializer.xml');
43
44 42
        $container->getDefinition('fos_rest.routing.loader.controller')->replaceArgument(4, $config['routing_loader']['default_format']);
45 42
        $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
46 42
        $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
47
48 42
        $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
49 42
        $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
50 42
        $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(3, $config['routing_loader']['include_format']);
51
52
        // The validator service alias is only set if validation is enabled for the request body converter
53 42
        $validator = $config['service']['validator'];
54 42
        unset($config['service']['validator']);
55
56 42
        foreach ($config['service'] as $key => $service) {
57 42
            if (null !== $service) {
58 42
                $container->setAlias('fos_rest.'.$key, $service);
59 42
            }
60 42
        }
61
62 42
        $this->loadForm($config, $loader, $container);
63 42
        $this->loadException($config, $loader, $container);
64 40
        $this->loadBodyConverter($config, $validator, $loader, $container);
65 40
        $this->loadView($config, $loader, $container);
66
67 40
        $this->loadBodyListener($config, $loader, $container);
68 40
        $this->loadFormatListener($config, $loader, $container);
69 40
        $this->loadVersioning($config, $loader, $container);
70 40
        $this->loadParamFetcherListener($config, $loader, $container);
71 40
        $this->loadAllowedMethodsListener($config, $loader, $container);
72 40
        $this->loadAccessDeniedListener($config, $loader, $container);
73 40
        $this->loadZoneMatcherListener($config, $loader, $container);
74
75
        // Needs RequestBodyParamConverter and View Handler loaded.
76 40
        $this->loadSerializer($config, $container);
77 40
    }
78
79 42
    private function loadForm(array $config, XmlFileLoader $loader, ContainerBuilder $container)
80
    {
81 42
        if (!empty($config['disable_csrf_role'])) {
82 1
            $loader->load('forms.xml');
83 1
            $container->getDefinition('fos_rest.form.extension.csrf_disable')->replaceArgument(1, $config['disable_csrf_role']);
84 1
        }
85 42
    }
86
87 40
    private function loadAccessDeniedListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
88
    {
89 40
        if ($config['access_denied_listener']['enabled'] && !empty($config['access_denied_listener']['formats'])) {
90
            $loader->load('access_denied_listener.xml');
91
92
            $service = $container->getDefinition('fos_rest.access_denied_listener');
93
94
            if (!empty($config['access_denied_listener']['service'])) {
95
                $service->clearTag('kernel.event_subscriber');
96
            }
97
98
            $service->replaceArgument(0, $config['access_denied_listener']['formats']);
99
            $service->replaceArgument(1, $config['unauthorized_challenge']);
100
        }
101 40
    }
102
103 40 View Code Duplication
    private function loadAllowedMethodsListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
104
    {
105 40
        if ($config['allowed_methods_listener']['enabled']) {
106 1
            if (!empty($config['allowed_methods_listener']['service'])) {
107
                $service = $container->getDefinition('fos_rest.allowed_methods_listener');
108
                $service->clearTag('kernel.event_listener');
109
            }
110
111 1
            $loader->load('allowed_methods_listener.xml');
112
113 1
            $container->getDefinition('fos_rest.allowed_methods_loader')->replaceArgument(1, $config['cache_dir']);
114 1
        }
115 40
    }
116
117 40
    private function loadBodyListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
118
    {
119 40
        if ($config['body_listener']['enabled']) {
120 39
            $loader->load('body_listener.xml');
121
122 39
            $service = $container->getDefinition('fos_rest.body_listener');
123
124 39
            if (!empty($config['body_listener']['service'])) {
125
                $service->clearTag('kernel.event_listener');
126
            }
127
128 39
            $service->replaceArgument(1, $config['body_listener']['throw_exception_on_unsupported_content_type']);
129 39
            $service->addMethodCall('setDefaultFormat', array($config['body_listener']['default_format']));
130
131 39
            $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(1, $config['body_listener']['decoders']);
132
133 39
            $arrayNormalizer = $config['body_listener']['array_normalizer'];
134
135 39
            if (null !== $arrayNormalizer['service']) {
136 3
                $bodyListener = $container->getDefinition('fos_rest.body_listener');
137 3
                $bodyListener->addArgument(new Reference($arrayNormalizer['service']));
138 3
                $bodyListener->addArgument($arrayNormalizer['forms']);
139 3
            }
140 39
        }
141 40
    }
142
143 40
    private function loadFormatListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
144
    {
145 40
        if ($config['format_listener']['enabled'] && !empty($config['format_listener']['rules'])) {
146 5
            $loader->load('format_listener.xml');
147
148 5
            if (!empty($config['format_listener']['service'])) {
149
                $service = $container->getDefinition('fos_rest.format_listener');
150
                $service->clearTag('kernel.event_listener');
151
            }
152
153 5
            $container->setParameter(
154 5
                'fos_rest.format_listener.rules',
155 5
                $config['format_listener']['rules']
156 5
            );
157
158 5
            if ($config['view']['mime_types']['enabled'] && !method_exists(Request::class, 'getMimeTypes')) {
159 2
                $container->getDefinition('fos_rest.format_negotiator')->addArgument($config['view']['mime_types']['formats']);
160 2
            }
161 5
        }
162 40
    }
163
164 40
    private function loadVersioning(array $config, XmlFileLoader $loader, ContainerBuilder $container)
165
    {
166 40
        if (!empty($config['versioning']['enabled'])) {
167 2
            $loader->load('versioning.xml');
168
169 2
            $versionListener = $container->getDefinition('fos_rest.versioning.listener');
170 2
            $versionListener->replaceArgument(2, $config['versioning']['default_version']);
171
172 2
            $resolvers = [];
173 2 View Code Duplication
            if ($config['versioning']['resolvers']['query']['enabled']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
174 2
                $resolvers['query'] = $container->getDefinition('fos_rest.versioning.query_parameter_resolver');
175 2
                $resolvers['query']->replaceArgument(0, $config['versioning']['resolvers']['query']['parameter_name']);
176 2
            }
177 2 View Code Duplication
            if ($config['versioning']['resolvers']['custom_header']['enabled']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
178 2
                $resolvers['custom_header'] = $container->getDefinition('fos_rest.versioning.header_resolver');
179 2
                $resolvers['custom_header']->replaceArgument(0, $config['versioning']['resolvers']['custom_header']['header_name']);
180 2
            }
181 2 View Code Duplication
            if ($config['versioning']['resolvers']['media_type']['enabled']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
182 2
                $resolvers['media_type'] = $container->getDefinition('fos_rest.versioning.media_type_resolver');
183 2
                $resolvers['media_type']->replaceArgument(0, $config['versioning']['resolvers']['media_type']['regex']);
184 2
            }
185
186 2
            $chainResolver = $container->getDefinition('fos_rest.versioning.chain_resolver');
187 2
            foreach ($config['versioning']['guessing_order'] as $resolver) {
188 2
                if (isset($resolvers[$resolver])) {
189 2
                    $chainResolver->addMethodCall('addResolver', [$resolvers[$resolver]]);
190 2
                }
191 2
            }
192 2
        }
193 40
    }
194
195 40 View Code Duplication
    private function loadParamFetcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
196
    {
197 40
        if ($config['param_fetcher_listener']['enabled']) {
198 4
            $loader->load('param_fetcher_listener.xml');
199
200 4
            if (!empty($config['param_fetcher_listener']['service'])) {
201
                $service = $container->getDefinition('fos_rest.param_fetcher_listener');
202
                $service->clearTag('kernel.event_listener');
203
            }
204
205 4
            if ($config['param_fetcher_listener']['force']) {
206 1
                $container->getDefinition('fos_rest.param_fetcher_listener')->replaceArgument(1, true);
207 1
            }
208 4
        }
209 40
    }
210
211 40
    private function loadBodyConverter(array $config, $validator, XmlFileLoader $loader, ContainerBuilder $container)
212
    {
213 40
        if (empty($config['body_converter'])) {
214
            return;
215
        }
216
217 40
        if (!empty($config['body_converter']['enabled'])) {
218 2
            $loader->load('request_body_param_converter.xml');
219
220 2
            if (!empty($config['body_converter']['validation_errors_argument'])) {
221 2
                $container->getDefinition('fos_rest.converter.request_body')->replaceArgument(4, $config['body_converter']['validation_errors_argument']);
222 2
            }
223 2
        }
224
225 40
        if (!empty($config['body_converter']['validate'])) {
226 2
            $container->setAlias('fos_rest.validator', $validator);
227 2
        }
228 40
    }
229
230 40
    private function loadView(array $config, XmlFileLoader $loader, ContainerBuilder $container)
231
    {
232 40
        if (!empty($config['view']['jsonp_handler'])) {
233 1
            $handler = new DefinitionDecorator($config['service']['view_handler']);
234 1
            $handler->setPublic(true);
235
236 1
            $jsonpHandler = new Reference('fos_rest.view_handler.jsonp');
237 1
            $handler->addMethodCall('registerHandler', ['jsonp', [$jsonpHandler, 'createResponse']]);
238 1
            $container->setDefinition('fos_rest.view_handler', $handler);
239
240 1
            $container->getDefinition('fos_rest.view_handler.jsonp')->replaceArgument(0, $config['view']['jsonp_handler']['callback_param']);
241
242 1
            if (empty($config['view']['mime_types']['jsonp'])) {
243 1
                $config['view']['mime_types']['jsonp'] = $config['view']['jsonp_handler']['mime_type'];
244 1
            }
245 1
        }
246
247 40 View Code Duplication
        if ($config['view']['mime_types']['enabled']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
248 2
            $loader->load('mime_type_listener.xml');
249
250 2
            if (!empty($config['mime_type_listener']['service'])) {
251
                $service = $container->getDefinition('fos_rest.mime_type_listener');
252
                $service->clearTag('kernel.event_listener');
253
            }
254
255 2
            $container->getDefinition('fos_rest.mime_type_listener')->replaceArgument(0, $config['view']['mime_types']['formats']);
256 2
        }
257
258 40 View Code Duplication
        if ($config['view']['view_response_listener']['enabled']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
259 7
            $loader->load('view_response_listener.xml');
260 7
            $service = $container->getDefinition('fos_rest.view_response_listener');
261
262 7
            if (!empty($config['view_response_listener']['service'])) {
263
                $service->clearTag('kernel.event_listener');
264
            }
265
266 7
            $service->replaceArgument(1, $config['view']['view_response_listener']['force']);
267 7
        }
268
269 40
        $formats = [];
270 40 View Code Duplication
        foreach ($config['view']['formats'] as $format => $enabled) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
271 40
            if ($enabled) {
272 40
                $formats[$format] = false;
273 40
            }
274 40
        }
275 40 View Code Duplication
        foreach ($config['view']['templating_formats'] as $format => $enabled) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
276 40
            if ($enabled) {
277 40
                $formats[$format] = true;
278 40
            }
279 40
        }
280
281 40
        $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(3, $formats);
282 40
        $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(3, $formats);
283 40
        $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(4, $formats);
284
285 40
        foreach ($config['view']['force_redirects'] as $format => $code) {
286 40
            if (true === $code) {
287 40
                $config['view']['force_redirects'][$format] = Response::HTTP_FOUND;
288 40
            }
289 40
        }
290
291 40 View Code Duplication
        if (!is_numeric($config['view']['failed_validation'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
292
            $config['view']['failed_validation'] = constant('\Symfony\Component\HttpFoundation\Response::'.$config['view']['failed_validation']);
293
        }
294
295 40
        $defaultViewHandler = $container->getDefinition('fos_rest.view_handler.default');
296 40
        $defaultViewHandler->replaceArgument(4, $formats);
297 40
        $defaultViewHandler->replaceArgument(5, $config['view']['failed_validation']);
298
299 40 View Code Duplication
        if (!is_numeric($config['view']['empty_content'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
300
            $config['view']['empty_content'] = constant('\Symfony\Component\HttpFoundation\Response::'.$config['view']['empty_content']);
301
        }
302
303 40
        $defaultViewHandler->replaceArgument(6, $config['view']['empty_content']);
304 40
        $defaultViewHandler->replaceArgument(7, $config['view']['serialize_null']);
305 40
        $defaultViewHandler->replaceArgument(8, $config['view']['force_redirects']);
306 40
        $defaultViewHandler->replaceArgument(9, $config['view']['default_engine']);
307 40
    }
308
309 42
    private function loadException(array $config, XmlFileLoader $loader, ContainerBuilder $container)
310
    {
311 42
        if ($config['exception']['enabled']) {
312 8
            $loader->load('exception_listener.xml');
313
314 8
            if (!empty($config['exception']['service'])) {
315
                $service = $container->getDefinition('fos_rest.exception_listener');
316
                $service->clearTag('kernel.event_subscriber');
317
            }
318
319 8
            if ($config['exception']['exception_controller']) {
320
                $container->getDefinition('fos_rest.exception_listener')->replaceArgument(0, $config['exception']['exception_controller']);
321 8
            } elseif (isset($container->getParameter('kernel.bundles')['TwigBundle'])) {
322 3
                $container->getDefinition('fos_rest.exception_listener')->replaceArgument(0, 'fos_rest.exception.twig_controller:showAction');
323 3
            }
324
325 8
            $container->getDefinition('fos_rest.exception.codes_map')
326 8
                ->replaceArgument(0, $config['exception']['codes']);
327 8
            $container->getDefinition('fos_rest.exception.messages_map')
328 8
                ->replaceArgument(0, $config['exception']['messages']);
329 8
        }
330
331 42
        foreach ($config['exception']['codes'] as $exception => $code) {
332 2
            if (!is_numeric($code)) {
333
                $config['exception']['codes'][$exception] = constant("\Symfony\Component\HttpFoundation\Response::$code");
334
            }
335
336 2
            $this->testExceptionExists($exception);
337 41
        }
338
339 41
        foreach ($config['exception']['messages'] as $exception => $message) {
340 4
            $this->testExceptionExists($exception);
341 40
        }
342 40
    }
343
344 40
    private function loadSerializer(array $config, ContainerBuilder $container)
345
    {
346 40
        $bodyConverter = $container->hasDefinition('fos_rest.converter.request_body') ? $container->getDefinition('fos_rest.converter.request_body') : null;
347 40
        $viewHandler = $container->getDefinition('fos_rest.view_handler.default');
348
349 40 View Code Duplication
        if (!empty($config['serializer']['version'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
350 1
            if ($bodyConverter) {
351
                $bodyConverter->replaceArgument(2, $config['serializer']['version']);
352
            }
353 1
            $viewHandler->addMethodCall('setExclusionStrategyVersion', array($config['serializer']['version']));
354 1
        }
355
356 40 View Code Duplication
        if (!empty($config['serializer']['groups'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
357 1
            if ($bodyConverter) {
358
                $bodyConverter->replaceArgument(1, $config['serializer']['groups']);
359
            }
360 1
            $viewHandler->addMethodCall('setExclusionStrategyGroups', array($config['serializer']['groups']));
361 1
        }
362
363 40
        $viewHandler->addMethodCall('setSerializeNullStrategy', array($config['serializer']['serialize_null']));
364 40
    }
365
366 40
    private function loadZoneMatcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
367
    {
368 40
        if (!empty($config['zone'])) {
369 1
            $loader->load('zone_matcher_listener.xml');
370 1
            $zoneMatcherListener = $container->getDefinition('fos_rest.zone_matcher_listener');
371
372 1
            foreach ($config['zone'] as $zone) {
373 1
                $matcher = $this->createZoneRequestMatcher($container,
374 1
                    $zone['path'],
375 1
                    $zone['host'],
376 1
                    $zone['methods'],
377 1
                    $zone['ips']
378 1
                );
379
380 1
                $zoneMatcherListener->addMethodCall('addRequestMatcher', array($matcher));
381 1
            }
382 1
        }
383 40
    }
384
385 1
    private function createZoneRequestMatcher(ContainerBuilder $container, $path = null, $host = null, $methods = array(), $ip = null)
386
    {
387 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...
388
            $methods = array_map('strtoupper', (array) $methods);
389
        }
390
391 1
        $serialized = serialize(array($path, $host, $methods, $ip));
392 1
        $id = 'fos_rest.zone_request_matcher.'.md5($serialized).sha1($serialized);
393
394
        // only add arguments that are necessary
395 1
        $arguments = array($path, $host, $methods, $ip);
396 1
        while (count($arguments) > 0 && !end($arguments)) {
397 1
            array_pop($arguments);
398 1
        }
399
400
        $container
401 1
            ->setDefinition($id, new DefinitionDecorator('fos_rest.zone_request_matcher'))
402 1
            ->setArguments($arguments)
403
        ;
404
405 1
        return new Reference($id);
406
    }
407
408
    /**
409
     * Checks if an exception is loadable.
410
     *
411
     * @param string $exception Class to test
412
     *
413
     * @throws \InvalidArgumentException if the class was not found.
414
     */
415 6
    private function testExceptionExists($exception)
416
    {
417 6
        if (!is_subclass_of($exception, \Exception::class) && !is_a($exception, \Exception::class, true)) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of might return inconsistent results on some PHP versions if \Exception::class can be an interface. If so, you could instead use ReflectionClass::implementsInterface.
Loading history...
418 2
            throw new \InvalidArgumentException("FOSRestBundle exception mapper: Could not load class '$exception' or the class does not extend from '\Exception'. Most probably this is a configuration problem.");
419
        }
420 4
    }
421
}
422