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 |
||
| 34 | class FOSRestExtension extends Extension |
||
| 35 | { |
||
| 36 | /** |
||
| 37 | * {@inheritdoc} |
||
| 38 | */ |
||
| 39 | public function getConfiguration(array $config, ContainerBuilder $container): Configuration |
||
| 40 | { |
||
| 41 | return new Configuration($container->getParameter('kernel.debug')); |
||
| 42 | } |
||
| 43 | 23 | ||
| 44 | public function load(array $configs, ContainerBuilder $container): void |
||
| 83 | |||
| 84 | 69 | private function loadForm(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 85 | 69 | { |
|
| 86 | 69 | if (!empty($config['disable_csrf_role'])) { |
|
| 87 | 69 | $loader->load('forms.xml'); |
|
| 88 | 69 | ||
| 89 | $definition = $container->getDefinition('fos_rest.form.extension.csrf_disable'); |
||
| 90 | 69 | $definition->replaceArgument(1, $config['disable_csrf_role']); |
|
| 91 | 69 | $definition->addTag('form.type_extension', ['extended_type' => FormType::class]); |
|
| 92 | } |
||
| 93 | } |
||
| 94 | 69 | ||
| 95 | private function loadAllowedMethodsListener(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
||
| 96 | 3 | { |
|
| 97 | if ($config['allowed_methods_listener']['enabled']) { |
||
| 98 | if (!empty($config['allowed_methods_listener']['service'])) { |
||
| 99 | $service = $container->getDefinition('fos_rest.allowed_methods_listener'); |
||
| 100 | $service->clearTag('kernel.event_listener'); |
||
| 101 | 69 | } |
|
| 102 | 69 | ||
| 103 | 69 | $loader->load('allowed_methods_listener.xml'); |
|
| 104 | 69 | ||
| 105 | $container->getDefinition('fos_rest.allowed_methods_loader')->replaceArgument(1, $config['cache_dir']); |
||
| 106 | 69 | } |
|
| 107 | 69 | } |
|
| 108 | 69 | ||
| 109 | 69 | private function loadBodyListener(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 110 | 69 | { |
|
| 111 | 69 | if ($config['body_listener']['enabled']) { |
|
| 112 | 69 | $loader->load('body_listener.xml'); |
|
| 113 | |||
| 114 | $service = $container->getDefinition('fos_rest.body_listener'); |
||
| 115 | 69 | ||
| 116 | 69 | if (!empty($config['body_listener']['service'])) { |
|
| 117 | $service->clearTag('kernel.event_listener'); |
||
| 118 | 69 | } |
|
| 119 | |||
| 120 | 69 | $service->replaceArgument(1, $config['body_listener']['throw_exception_on_unsupported_content_type']); |
|
| 121 | 2 | $service->addMethodCall('setDefaultFormat', array($config['body_listener']['default_format'])); |
|
| 122 | |||
| 123 | 2 | $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(1, $config['body_listener']['decoders']); |
|
| 124 | 2 | ||
| 125 | $decoderServicesMap = array(); |
||
| 126 | |||
| 127 | 2 | foreach ($config['body_listener']['decoders'] as $id) { |
|
| 128 | $decoderServicesMap[$id] = new Reference($id); |
||
| 129 | } |
||
| 130 | 2 | ||
| 131 | $decodersServiceLocator = ServiceLocatorTagPass::register($container, $decoderServicesMap); |
||
| 132 | $container->getDefinition('fos_rest.decoder_provider')->replaceArgument(0, $decodersServiceLocator); |
||
| 133 | 69 | ||
| 134 | $arrayNormalizer = $config['body_listener']['array_normalizer']; |
||
| 135 | 69 | ||
| 136 | if (null !== $arrayNormalizer['service']) { |
||
| 137 | 69 | $bodyListener = $container->getDefinition('fos_rest.body_listener'); |
|
| 138 | $bodyListener->addArgument(new Reference($arrayNormalizer['service'])); |
||
| 139 | $bodyListener->addArgument($arrayNormalizer['forms']); |
||
| 140 | } |
||
| 141 | } |
||
| 142 | } |
||
| 143 | |||
| 144 | private function loadFormatListener(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
||
| 145 | { |
||
| 146 | if ($config['format_listener']['enabled'] && !empty($config['format_listener']['rules'])) { |
||
| 147 | $loader->load('format_listener.xml'); |
||
| 148 | |||
| 149 | 69 | if (!empty($config['format_listener']['service'])) { |
|
| 150 | $service = $container->getDefinition('fos_rest.format_listener'); |
||
| 151 | 69 | $service->clearTag('kernel.event_listener'); |
|
| 152 | } |
||
| 153 | 69 | ||
| 154 | 3 | $container->setParameter( |
|
| 155 | 'fos_rest.format_listener.rules', |
||
| 156 | $config['format_listener']['rules'] |
||
| 157 | ); |
||
| 158 | } |
||
| 159 | 3 | } |
|
| 160 | |||
| 161 | 3 | private function loadVersioning(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 162 | { |
||
| 163 | 69 | if (!empty($config['versioning']['enabled'])) { |
|
| 164 | $loader->load('versioning.xml'); |
||
| 165 | 69 | ||
| 166 | $versionListener = $container->getDefinition('fos_rest.versioning.listener'); |
||
| 167 | 69 | $versionListener->replaceArgument(1, $config['versioning']['default_version']); |
|
| 168 | 15 | ||
| 169 | $resolvers = []; |
||
| 170 | 15 | if ($config['versioning']['resolvers']['query']['enabled']) { |
|
| 171 | $resolvers['query'] = $container->getDefinition('fos_rest.versioning.query_parameter_resolver'); |
||
| 172 | 15 | $resolvers['query']->replaceArgument(0, $config['versioning']['resolvers']['query']['parameter_name']); |
|
| 173 | } |
||
| 174 | if ($config['versioning']['resolvers']['custom_header']['enabled']) { |
||
| 175 | $resolvers['custom_header'] = $container->getDefinition('fos_rest.versioning.header_resolver'); |
||
| 176 | 15 | $resolvers['custom_header']->replaceArgument(0, $config['versioning']['resolvers']['custom_header']['header_name']); |
|
| 177 | 15 | } |
|
| 178 | if ($config['versioning']['resolvers']['media_type']['enabled']) { |
||
| 179 | 15 | $resolvers['media_type'] = $container->getDefinition('fos_rest.versioning.media_type_resolver'); |
|
| 180 | $resolvers['media_type']->replaceArgument(0, $config['versioning']['resolvers']['media_type']['regex']); |
||
| 181 | 15 | } |
|
| 182 | 15 | ||
| 183 | $chainResolver = $container->getDefinition('fos_rest.versioning.chain_resolver'); |
||
| 184 | 15 | foreach ($config['versioning']['guessing_order'] as $resolver) { |
|
| 185 | 15 | if (isset($resolvers[$resolver])) { |
|
| 186 | $chainResolver->addMethodCall('addResolver', [$resolvers[$resolver]]); |
||
| 187 | } |
||
| 188 | 15 | } |
|
| 189 | 15 | } |
|
| 190 | } |
||
| 191 | |||
| 192 | 15 | private function loadParamFetcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 193 | { |
||
| 194 | 15 | if ($config['param_fetcher_listener']['enabled']) { |
|
| 195 | 3 | if (!class_exists(Constraint::class)) { |
|
| 196 | 3 | throw new \LogicException('Enabling the fos_rest.param_fetcher_listener option when the Symfony Validator component is not installed is not supported. Try installing the symfony/validator package.'); |
|
| 197 | 3 | } |
|
| 198 | |||
| 199 | $loader->load('param_fetcher_listener.xml'); |
||
| 200 | 69 | ||
| 201 | if (!empty($config['param_fetcher_listener']['service'])) { |
||
| 202 | 69 | $service = $container->getDefinition('fos_rest.param_fetcher_listener'); |
|
| 203 | $service->clearTag('kernel.event_listener'); |
||
| 204 | 69 | } |
|
| 205 | 6 | ||
| 206 | if ($config['param_fetcher_listener']['force']) { |
||
| 207 | 6 | $container->getDefinition('fos_rest.param_fetcher_listener')->replaceArgument(1, true); |
|
| 208 | } |
||
| 209 | } |
||
| 210 | } |
||
| 211 | |||
| 212 | 6 | private function loadBodyConverter(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 224 | 2 | ||
| 225 | 2 | private function loadView(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 226 | { |
||
| 227 | 2 | if (!empty($config['view']['jsonp_handler'])) { |
|
| 228 | 2 | $handler = new ChildDefinition($config['service']['view_handler']); |
|
| 229 | 2 | $handler->setPublic(true); |
|
| 230 | 2 | ||
| 231 | $jsonpHandler = new Reference('fos_rest.view_handler.jsonp'); |
||
| 291 | 1 | ||
| 292 | 1 | private function loadException(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 342 | 69 | ||
| 343 | 69 | private function loadSerializer(array $config, ContainerBuilder $container): void |
|
| 370 | |||
| 371 | 69 | private function loadZoneMatcherListener(array $config, XmlFileLoader $loader, ContainerBuilder $container): void |
|
| 390 | |||
| 391 | private function createZoneRequestMatcher(ContainerBuilder $container, ?string $path = null, ?string $host = null, array $methods = array(), array $ips = null): Reference |
||
| 413 | } |
||
| 414 |
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.