Completed
Pull Request — master (#1358)
by Guilh
07:06
created

FOSRestExtension::loadAllowedMethodsListener()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 7

Duplication

Lines 13
Ratio 100 %

Code Coverage

Tests 7
CRAP Score 3.243
Metric Value
dl 13
loc 13
ccs 7
cts 10
cp 0.7
rs 9.4285
cc 3
eloc 7
nc 3
nop 3
crap 3.243
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 46
    public function load(array $configs, ContainerBuilder $container)
35
    {
36 46
        $config = $this->processConfiguration(new Configuration(), $configs);
37
38 41
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
39 41
        $loader->load('view.xml');
40 41
        $loader->load('routing.xml');
41 41
        $loader->load('request.xml');
42 41
        $loader->load('serializer.xml');
43
44 41
        $container->getDefinition('fos_rest.routing.loader.controller')->replaceArgument(4, $config['routing_loader']['default_format']);
45 41
        $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
46 41
        $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(4, $config['routing_loader']['default_format']);
47
48 41
        $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
49 41
        $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(2, $config['routing_loader']['include_format']);
50 41
        $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 41
        $validator = $config['service']['validator'];
54 41
        unset($config['service']['validator']);
55
56 41
        foreach ($config['service'] as $key => $service) {
57 41
            if (null !== $service) {
58 41
                $container->setAlias('fos_rest.'.$key, $service);
59 41
            }
60 41
        }
61
62 41
        $this->loadForm($config, $loader, $container);
63 41
        $this->loadException($config, $loader, $container);
64 39
        $this->loadBodyConverter($config, $validator, $loader, $container);
65 39
        $this->loadView($config, $loader, $container);
66
67 39
        $this->loadBodyListener($config, $loader, $container);
68 39
        $this->loadFormatListener($config, $loader, $container);
69 39
        $this->loadVersioning($config, $loader, $container);
70 39
        $this->loadParamFetcherListener($config, $loader, $container);
71 39
        $this->loadAllowedMethodsListener($config, $loader, $container);
72 39
        $this->loadAccessDeniedListener($config, $loader, $container);
73 39
        $this->loadZoneMatcherListener($config, $loader, $container);
74
75
        // Needs RequestBodyParamConverter and View Handler loaded.
76 39
        $this->loadSerializer($config, $container);
77 39
    }
78
79 41
    private function loadForm(array $config, XmlFileLoader $loader, ContainerBuilder $container)
80
    {
81 41
        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 41
    }
86
87 39
    private function loadAccessDeniedListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
88
    {
89 39
        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 39
    }
102
103 39 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 39
        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 39
    }
116
117 39
    private function loadBodyListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
118
    {
119 39
        if ($config['body_listener']['enabled']) {
120 38
            $loader->load('body_listener.xml');
121
122 38
            $service = $container->getDefinition('fos_rest.body_listener');
123
124 38
            if (!empty($config['body_listener']['service'])) {
125
                $service->clearTag('kernel.event_listener');
126
            }
127
128 38
            $service->replaceArgument(1, $config['body_listener']['throw_exception_on_unsupported_content_type']);
129 38
            $service->addMethodCall('setDefaultFormat', array($config['body_listener']['default_format']));
130
131 38
            $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(1, $config['body_listener']['decoders']);
132
133 38
            $arrayNormalizer = $config['body_listener']['array_normalizer'];
134
135 38
            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 38
        }
141 39
    }
142
143 39
    private function loadFormatListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
144
    {
145 39
        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 39
    }
163
164 39
    private function loadVersioning(array $config, XmlFileLoader $loader, ContainerBuilder $container)
165
    {
166 39
        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 39
    }
194
195 39 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 39
        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 39
    }
210
211 39
    private function loadBodyConverter(array $config, $validator, XmlFileLoader $loader, ContainerBuilder $container)
212
    {
213 39
        if (empty($config['body_converter'])) {
214
            return;
215
        }
216
217 39
        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 39
        if (!empty($config['body_converter']['validate'])) {
226 2
            $container->setAlias('fos_rest.validator', $validator);
227 2
        }
228 39
    }
229
230 39
    private function loadView(array $config, XmlFileLoader $loader, ContainerBuilder $container)
231
    {
232 39
        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 39 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 39 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 6
            $loader->load('view_response_listener.xml');
260 6
            $service = $container->getDefinition('fos_rest.view_response_listener');
261
262 6
            if (!empty($config['view_response_listener']['service'])) {
263
                $service->clearTag('kernel.event_listener');
264
            }
265
266 6
            $service->replaceArgument(1, $config['view']['view_response_listener']['force']);
267 6
        }
268
269 39
        $formats = [];
270 39 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 39
            if ($enabled) {
272 39
                $formats[$format] = false;
273 39
            }
274 39
        }
275 39 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 39
            if ($enabled) {
277 39
                $formats[$format] = true;
278 39
            }
279 39
        }
280
281 39
        $container->getDefinition('fos_rest.routing.loader.yaml_collection')->replaceArgument(3, $formats);
282 39
        $container->getDefinition('fos_rest.routing.loader.xml_collection')->replaceArgument(3, $formats);
283 39
        $container->getDefinition('fos_rest.routing.loader.reader.action')->replaceArgument(4, $formats);
284
285 39
        foreach ($config['view']['force_redirects'] as $format => $code) {
286 39
            if (true === $code) {
287 39
                $config['view']['force_redirects'][$format] = Response::HTTP_FOUND;
288 39
            }
289 39
        }
290
291 39 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 39
        $defaultViewHandler = $container->getDefinition('fos_rest.view_handler.default');
296 39
        $defaultViewHandler->replaceArgument(4, $formats);
297 39
        $defaultViewHandler->replaceArgument(5, $config['view']['failed_validation']);
298
299 39 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 39
        $defaultViewHandler->replaceArgument(6, $config['view']['empty_content']);
304 39
        $defaultViewHandler->replaceArgument(7, $config['view']['serialize_null']);
305 39
        $defaultViewHandler->replaceArgument(8, $config['view']['force_redirects']);
306 39
        $defaultViewHandler->replaceArgument(9, $config['view']['default_engine']);
307 39
    }
308
309 41
    private function loadException(array $config, XmlFileLoader $loader, ContainerBuilder $container)
310
    {
311 41
        if ($config['exception']['enabled']) {
312 7
            $loader->load('exception_listener.xml');
313
314 7
            if (!empty($config['exception']['service'])) {
315
                $service = $container->getDefinition('fos_rest.exception_listener');
316
                $service->clearTag('kernel.event_subscriber');
317
            }
318
319 7
            if ($config['exception']['exception_controller']) {
320
                $container->getDefinition('fos_rest.exception_listener')->replaceArgument(0, $config['exception']['exception_controller']);
321 7
            } elseif (isset($container->getParameter('kernel.bundles')['TwigBundle'])) {
322 1
                $container->getDefinition('fos_rest.exception_listener')->replaceArgument(0, 'fos_rest.exception.twig_controller:showAction');
323 1
            }
324
325 7
            $container->getDefinition('fos_rest.exception.controller')
326 7
                ->replaceArgument(2, $config['exception']['codes']);
327 7
            $container->getDefinition('fos_rest.serializer.exception_normalizer.jms')
328 7
                ->replaceArgument(0, $config['exception']['messages']);
329 7
            $container->getDefinition('fos_rest.serializer.exception_normalizer.symfony')
330 7
                ->replaceArgument(0, $config['exception']['messages']);
331 7
        }
332
333 41
        foreach ($config['exception']['codes'] as $exception => $code) {
334 2
            if (!is_numeric($code)) {
335
                $config['exception']['codes'][$exception] = constant("\Symfony\Component\HttpFoundation\Response::$code");
336
            }
337
338 2
            $this->testExceptionExists($exception);
339 40
        }
340
341 40
        foreach ($config['exception']['messages'] as $exception => $message) {
342 3
            $this->testExceptionExists($exception);
343 39
        }
344 39
    }
345
346 39
    private function loadSerializer(array $config, ContainerBuilder $container)
347
    {
348 39
        $bodyConverter = $container->hasDefinition('fos_rest.converter.request_body') ? $container->getDefinition('fos_rest.converter.request_body') : null;
349 39
        $viewHandler = $container->getDefinition('fos_rest.view_handler.default');
350
351 39 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...
352 1
            if ($bodyConverter) {
353
                $bodyConverter->replaceArgument(2, $config['serializer']['version']);
354
            }
355 1
            $viewHandler->addMethodCall('setExclusionStrategyVersion', array($config['serializer']['version']));
356 1
        }
357
358 39 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...
359 1
            if ($bodyConverter) {
360
                $bodyConverter->replaceArgument(1, $config['serializer']['groups']);
361
            }
362 1
            $viewHandler->addMethodCall('setExclusionStrategyGroups', array($config['serializer']['groups']));
363 1
        }
364
365 39
        $viewHandler->addMethodCall('setSerializeNullStrategy', array($config['serializer']['serialize_null']));
366 39
    }
367
368 39
    private function loadZoneMatcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container)
369
    {
370 39
        if (!empty($config['zone'])) {
371 1
            $loader->load('zone_matcher_listener.xml');
372 1
            $zoneMatcherListener = $container->getDefinition('fos_rest.zone_matcher_listener');
373
374 1
            foreach ($config['zone'] as $zone) {
375 1
                $matcher = $this->createZoneRequestMatcher($container,
376 1
                    $zone['path'],
377 1
                    $zone['host'],
378 1
                    $zone['methods'],
379 1
                    $zone['ips']
380 1
                );
381
382 1
                $zoneMatcherListener->addMethodCall('addRequestMatcher', array($matcher));
383 1
            }
384 1
        }
385 39
    }
386
387 1
    private function createZoneRequestMatcher(ContainerBuilder $container, $path = null, $host = null, $methods = array(), $ip = null)
388
    {
389 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...
390
            $methods = array_map('strtoupper', (array) $methods);
391
        }
392
393 1
        $serialized = serialize(array($path, $host, $methods, $ip));
394 1
        $id = 'fos_rest.zone_request_matcher.'.md5($serialized).sha1($serialized);
395
396
        // only add arguments that are necessary
397 1
        $arguments = array($path, $host, $methods, $ip);
398 1
        while (count($arguments) > 0 && !end($arguments)) {
399 1
            array_pop($arguments);
400 1
        }
401
402
        $container
403 1
            ->setDefinition($id, new DefinitionDecorator('fos_rest.zone_request_matcher'))
404 1
            ->setArguments($arguments)
405
        ;
406
407 1
        return new Reference($id);
408
    }
409
410
    /**
411
     * Checks if an exception is loadable.
412
     *
413
     * @param string $exception Class to test
414
     *
415
     * @throws \InvalidArgumentException if the class was not found.
416
     */
417 5
    private function testExceptionExists($exception)
418
    {
419 5
        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...
420 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.");
421
        }
422 3
    }
423
}
424