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:
1 | <?php |
||
32 | final class Configuration implements ConfigurationInterface |
||
33 | { |
||
34 | /** |
||
35 | * Default debug mode value. |
||
36 | * |
||
37 | * @var bool |
||
38 | */ |
||
39 | private $debug; |
||
40 | |||
41 | 85 | public function __construct(bool $debug) |
|
45 | |||
46 | 84 | public function getConfigTreeBuilder(): TreeBuilder |
|
47 | { |
||
48 | 84 | $treeBuilder = new TreeBuilder('fos_rest'); |
|
49 | |||
50 | 84 | if (method_exists($treeBuilder, 'getRootNode')) { |
|
51 | 84 | $rootNode = $treeBuilder->getRootNode(); |
|
52 | } else { |
||
53 | $rootNode = $treeBuilder->root('fos_rest'); |
||
|
|||
54 | } |
||
55 | |||
56 | $rootNode |
||
57 | 84 | ->children() |
|
58 | 84 | ->scalarNode('disable_csrf_role')->defaultNull()->end() |
|
59 | 84 | ->arrayNode('access_denied_listener') |
|
60 | 84 | ->canBeEnabled() |
|
61 | 84 | ->setDeprecated('The "%path%.%node%" option is deprecated since FOSRestBundle 2.8.') |
|
62 | 84 | ->beforeNormalization() |
|
63 | View Code Duplication | ->ifArray()->then(function ($v) { |
|
64 | if (!empty($v) && empty($v['formats'])) { |
||
65 | unset($v['enabled']); |
||
66 | $v = ['enabled' => true, 'formats' => $v]; |
||
67 | } |
||
68 | |||
69 | return $v; |
||
70 | 84 | }) |
|
71 | 84 | ->end() |
|
72 | 84 | ->fixXmlConfig('format', 'formats') |
|
73 | 84 | ->children() |
|
74 | 84 | ->scalarNode('service')->defaultNull()->end() |
|
75 | 84 | ->arrayNode('formats') |
|
76 | 84 | ->useAttributeAsKey('name') |
|
77 | 84 | ->prototype('boolean')->end() |
|
78 | 84 | ->end() |
|
79 | 84 | ->end() |
|
80 | 84 | ->end() |
|
81 | 84 | ->scalarNode('unauthorized_challenge')->defaultNull()->end() |
|
82 | 84 | ->arrayNode('param_fetcher_listener') |
|
83 | 84 | ->beforeNormalization() |
|
84 | 84 | ->ifString() |
|
85 | View Code Duplication | ->then(function ($v) { |
|
86 | 1 | return ['enabled' => in_array($v, ['force', 'true']), 'force' => 'force' === $v]; |
|
87 | 84 | }) |
|
88 | 84 | ->end() |
|
89 | 84 | ->canBeEnabled() |
|
90 | 84 | ->children() |
|
91 | 84 | ->booleanNode('force')->defaultFalse()->end() |
|
92 | 84 | ->scalarNode('service')->defaultNull()->end() |
|
93 | 84 | ->end() |
|
94 | 84 | ->end() |
|
95 | 84 | ->scalarNode('cache_dir')->cannotBeEmpty()->defaultValue('%kernel.cache_dir%/fos_rest')->end() |
|
96 | 84 | ->arrayNode('allowed_methods_listener') |
|
97 | 84 | ->canBeEnabled() |
|
98 | 84 | ->children() |
|
99 | 84 | ->scalarNode('service')->defaultNull()->end() |
|
100 | 84 | ->end() |
|
101 | 84 | ->end() |
|
102 | 84 | ->arrayNode('routing_loader') |
|
103 | 84 | ->addDefaultsIfNotSet() |
|
104 | 84 | ->beforeNormalization() |
|
105 | ->ifTrue(function ($v) { return isset($v['enabled']) && false !== $v['enabled']; }) |
||
106 | ->then(function ($v) { |
||
107 | @trigger_error('Enabling the route generation feature is deprecated since FOSRestBundle 2.8.', E_USER_DEPRECATED); |
||
108 | |||
109 | return $v; |
||
110 | 84 | }) |
|
111 | 84 | ->end() |
|
112 | 84 | ->beforeNormalization() |
|
113 | ->ifTrue(function ($v) { return is_bool($v); }) |
||
114 | ->then(function ($v) { |
||
115 | return [ |
||
116 | 66 | 'enabled' => $v, |
|
117 | ]; |
||
118 | 84 | }) |
|
119 | 84 | ->end() |
|
120 | 84 | ->children() |
|
121 | 84 | ->booleanNode('enabled') |
|
122 | ->defaultValue(function () { |
||
123 | 7 | @trigger_error('Enabling the route generation feature is deprecated since FOSRestBundle 2.8.', E_USER_DEPRECATED); |
|
124 | |||
125 | 7 | return true; |
|
126 | 84 | }) |
|
127 | 84 | ->end() |
|
128 | 84 | ->scalarNode('default_format')->defaultNull()->end() |
|
129 | 84 | ->scalarNode('prefix_methods')->defaultTrue()->end() |
|
130 | 84 | ->scalarNode('include_format')->defaultTrue()->end() |
|
131 | 84 | ->end() |
|
132 | 84 | ->end() |
|
133 | 84 | ->arrayNode('body_converter') |
|
134 | 84 | ->canBeEnabled() |
|
135 | 84 | ->children() |
|
136 | 84 | ->scalarNode('validate') |
|
137 | 84 | ->defaultFalse() |
|
138 | 84 | ->beforeNormalization() |
|
139 | 84 | ->ifTrue() |
|
140 | ->then(function ($value) { |
||
141 | 3 | if (!class_exists(OptionsResolver::class)) { |
|
142 | throw new InvalidConfigurationException("'body_converter.validate: true' requires OptionsResolver component installation ( composer require symfony/options-resolver )"); |
||
143 | } |
||
144 | |||
145 | 3 | return $value; |
|
146 | 84 | }) |
|
147 | 84 | ->end() |
|
148 | 84 | ->end() |
|
149 | 84 | ->scalarNode('validation_errors_argument')->defaultValue('validationErrors')->end() |
|
150 | 84 | ->end() |
|
151 | 84 | ->end() |
|
152 | 84 | ->arrayNode('service') |
|
153 | 84 | ->addDefaultsIfNotSet() |
|
154 | 84 | ->children() |
|
155 | 84 | ->scalarNode('router')->defaultValue('router')->setDeprecated('The "%path%.%node%" configuration key has been deprecated in FOSRestBundle 2.8.')->end() |
|
156 | 84 | ->scalarNode('templating') |
|
157 | 84 | ->defaultValue('templating') |
|
158 | 84 | ->setDeprecated('The "%path%.%node%" option is deprecated since FOSRestBundle 2.8.') |
|
159 | 84 | ->end() |
|
160 | 84 | ->scalarNode('serializer')->defaultNull()->end() |
|
161 | 84 | ->scalarNode('view_handler')->defaultValue('fos_rest.view_handler.default')->end() |
|
162 | 84 | ->scalarNode('inflector') |
|
163 | 84 | ->defaultValue('fos_rest.inflector.doctrine') |
|
164 | 84 | ->setDeprecated('The "%path%.%node%" option is deprecated since FOSRestBundle 2.8.') |
|
165 | 84 | ->end() |
|
166 | 84 | ->scalarNode('validator')->defaultValue('validator')->end() |
|
167 | 84 | ->end() |
|
168 | 84 | ->end() |
|
169 | 84 | ->arrayNode('serializer') |
|
170 | 84 | ->addDefaultsIfNotSet() |
|
171 | 84 | ->children() |
|
172 | 84 | ->scalarNode('version')->defaultNull()->end() |
|
173 | 84 | ->arrayNode('groups') |
|
174 | 84 | ->prototype('scalar')->end() |
|
175 | 84 | ->end() |
|
176 | 84 | ->booleanNode('serialize_null')->defaultFalse()->end() |
|
177 | 84 | ->end() |
|
178 | 84 | ->end() |
|
179 | 84 | ->arrayNode('zone') |
|
180 | 84 | ->cannotBeOverwritten() |
|
181 | 84 | ->prototype('array') |
|
182 | 84 | ->fixXmlConfig('ip') |
|
183 | 84 | ->children() |
|
184 | 84 | ->scalarNode('path') |
|
185 | 84 | ->defaultNull() |
|
186 | 84 | ->info('use the urldecoded format') |
|
187 | 84 | ->example('^/path to resource/') |
|
188 | 84 | ->end() |
|
189 | 84 | ->scalarNode('host')->defaultNull()->end() |
|
190 | 84 | ->arrayNode('methods') |
|
191 | ->beforeNormalization()->ifString()->then(function ($v) { |
||
192 | return preg_split('/\s*,\s*/', $v); |
||
193 | 84 | })->end() |
|
194 | 84 | ->prototype('scalar')->end() |
|
195 | 84 | ->end() |
|
196 | 84 | ->arrayNode('ips') |
|
197 | ->beforeNormalization()->ifString()->then(function ($v) { |
||
198 | 1 | return array($v); |
|
199 | 84 | })->end() |
|
200 | 84 | ->prototype('scalar')->end() |
|
201 | 84 | ->end() |
|
202 | 84 | ->end() |
|
203 | 84 | ->end() |
|
204 | 84 | ->end() |
|
205 | 84 | ->end(); |
|
206 | |||
207 | 84 | $this->addViewSection($rootNode); |
|
208 | 84 | $this->addExceptionSection($rootNode); |
|
209 | 84 | $this->addBodyListenerSection($rootNode); |
|
210 | 84 | $this->addFormatListenerSection($rootNode); |
|
211 | 84 | $this->addVersioningSection($rootNode); |
|
212 | |||
213 | 84 | return $treeBuilder; |
|
214 | } |
||
215 | |||
216 | 84 | private function addViewSection(ArrayNodeDefinition $rootNode) |
|
217 | { |
||
218 | $rootNode |
||
219 | 84 | ->children() |
|
220 | 84 | ->arrayNode('view') |
|
221 | 84 | ->fixXmlConfig('format', 'formats') |
|
222 | 84 | ->fixXmlConfig('mime_type', 'mime_types') |
|
223 | 84 | ->fixXmlConfig('templating_format', 'templating_formats') |
|
224 | 84 | ->fixXmlConfig('force_redirect', 'force_redirects') |
|
225 | 84 | ->addDefaultsIfNotSet() |
|
226 | 84 | ->children() |
|
227 | 84 | ->scalarNode('default_engine') |
|
228 | 84 | ->setDeprecated('The "%path%.%node%" option has been deprecated in FOSRestBundle 2.8.') |
|
229 | 84 | ->defaultValue('twig') |
|
230 | 84 | ->end() |
|
231 | 84 | ->arrayNode('force_redirects') |
|
232 | 84 | ->setDeprecated('The "%path%.%node%" option has been deprecated in FOSRestBundle 2.8.') |
|
233 | 84 | ->useAttributeAsKey('name') |
|
234 | 84 | ->defaultValue(['html' => true]) |
|
235 | 84 | ->prototype('boolean')->end() |
|
236 | 84 | ->end() |
|
237 | 84 | ->arrayNode('mime_types') |
|
238 | 84 | ->canBeEnabled() |
|
239 | 84 | ->beforeNormalization() |
|
240 | View Code Duplication | ->ifArray()->then(function ($v) { |
|
241 | 1 | if (!empty($v) && empty($v['formats'])) { |
|
242 | 1 | unset($v['enabled']); |
|
243 | 1 | $v = ['enabled' => true, 'formats' => $v]; |
|
244 | } |
||
245 | |||
246 | 1 | return $v; |
|
247 | 84 | }) |
|
248 | 84 | ->end() |
|
249 | 84 | ->fixXmlConfig('format', 'formats') |
|
250 | 84 | ->children() |
|
251 | 84 | ->scalarNode('service')->defaultNull()->end() |
|
252 | 84 | ->arrayNode('formats') |
|
253 | 84 | ->useAttributeAsKey('name') |
|
254 | 84 | ->prototype('array') |
|
255 | 84 | ->beforeNormalization() |
|
256 | 84 | ->ifString() |
|
257 | ->then(function ($v) { return array($v); }) |
||
258 | 84 | ->end() |
|
259 | 84 | ->prototype('scalar')->end() |
|
260 | 84 | ->end() |
|
261 | 84 | ->end() |
|
262 | 84 | ->end() |
|
263 | 84 | ->end() |
|
264 | 84 | ->arrayNode('formats') |
|
265 | 84 | ->useAttributeAsKey('name') |
|
266 | 84 | ->defaultValue(['json' => true, 'xml' => true]) |
|
267 | 84 | ->prototype('boolean')->end() |
|
268 | 84 | ->end() |
|
269 | 84 | ->arrayNode('templating_formats') |
|
270 | 84 | ->setDeprecated('The "%path%.%node%" configuration key has been deprecated in FOSRestBundle 2.8.') |
|
271 | 84 | ->useAttributeAsKey('name') |
|
272 | 84 | ->defaultValue(['html' => true]) |
|
273 | 84 | ->prototype('boolean')->end() |
|
274 | 84 | ->end() |
|
275 | 84 | ->arrayNode('view_response_listener') |
|
276 | 84 | ->beforeNormalization() |
|
277 | 84 | ->ifString() |
|
278 | View Code Duplication | ->then(function ($v) { |
|
279 | 9 | return ['enabled' => in_array($v, ['force', 'true']), 'force' => 'force' === $v]; |
|
280 | 84 | }) |
|
281 | 84 | ->end() |
|
282 | 84 | ->canBeEnabled() |
|
283 | 84 | ->children() |
|
284 | 84 | ->booleanNode('force')->defaultFalse()->end() |
|
285 | 84 | ->scalarNode('service')->defaultNull()->end() |
|
286 | 84 | ->end() |
|
287 | 84 | ->end() |
|
288 | 84 | ->scalarNode('failed_validation')->defaultValue(Response::HTTP_BAD_REQUEST)->end() |
|
289 | 84 | ->scalarNode('empty_content')->defaultValue(Response::HTTP_NO_CONTENT)->end() |
|
290 | 84 | ->booleanNode('serialize_null')->defaultFalse()->end() |
|
291 | 84 | ->arrayNode('jsonp_handler') |
|
292 | 84 | ->canBeUnset() |
|
293 | 84 | ->children() |
|
294 | 84 | ->scalarNode('callback_param')->defaultValue('callback')->end() |
|
295 | 84 | ->scalarNode('mime_type')->defaultValue('application/javascript+jsonp')->end() |
|
296 | 84 | ->end() |
|
297 | 84 | ->end() |
|
298 | 84 | ->end() |
|
299 | 84 | ->end() |
|
300 | 84 | ->end(); |
|
301 | 84 | } |
|
302 | |||
303 | 84 | private function addBodyListenerSection(ArrayNodeDefinition $rootNode) |
|
304 | { |
||
305 | 84 | $decodersDefaultValue = ['json' => 'fos_rest.decoder.json']; |
|
306 | 84 | if (class_exists(XmlEncoder::class)) { |
|
307 | 84 | $decodersDefaultValue['xml'] = 'fos_rest.decoder.xml'; |
|
308 | } |
||
309 | $rootNode |
||
310 | 84 | ->children() |
|
311 | 84 | ->arrayNode('body_listener') |
|
312 | 84 | ->fixXmlConfig('decoder', 'decoders') |
|
313 | 84 | ->addDefaultsIfNotSet() |
|
314 | 84 | ->canBeUnset() |
|
315 | 84 | ->treatFalseLike(['enabled' => false]) |
|
316 | 84 | ->treatTrueLike(['enabled' => true]) |
|
317 | 84 | ->treatNullLike(['enabled' => true]) |
|
318 | 84 | ->children() |
|
319 | 84 | ->booleanNode('enabled') |
|
320 | ->defaultValue(function () { |
||
321 | 7 | @trigger_error('The body_listener config has been enabled by default and will be disabled by default in FOSRestBundle 3.0. Please enable or disable it explicitly.', E_USER_DEPRECATED); |
|
322 | |||
323 | 7 | return true; |
|
324 | 84 | }) |
|
325 | 84 | ->end() |
|
326 | 84 | ->scalarNode('service')->defaultNull()->end() |
|
327 | 84 | ->scalarNode('default_format')->defaultNull()->end() |
|
328 | 84 | ->booleanNode('throw_exception_on_unsupported_content_type') |
|
329 | 84 | ->defaultFalse() |
|
330 | 84 | ->end() |
|
331 | 84 | ->arrayNode('decoders') |
|
332 | 84 | ->useAttributeAsKey('name') |
|
333 | 84 | ->defaultValue($decodersDefaultValue) |
|
334 | 84 | ->prototype('scalar')->end() |
|
335 | 84 | ->end() |
|
336 | 84 | ->arrayNode('array_normalizer') |
|
337 | 84 | ->addDefaultsIfNotSet() |
|
338 | 84 | ->beforeNormalization() |
|
339 | ->ifString()->then(function ($v) { |
||
340 | 1 | return ['service' => $v]; |
|
341 | 84 | }) |
|
342 | 84 | ->end() |
|
343 | 84 | ->children() |
|
344 | 84 | ->scalarNode('service')->defaultNull()->end() |
|
345 | 84 | ->booleanNode('forms')->defaultFalse()->end() |
|
346 | 84 | ->end() |
|
347 | 84 | ->end() |
|
348 | 84 | ->end() |
|
349 | 84 | ->end() |
|
350 | 84 | ->end(); |
|
351 | 84 | } |
|
352 | |||
353 | 84 | private function addFormatListenerSection(ArrayNodeDefinition $rootNode) |
|
406 | |||
407 | 84 | private function addVersioningSection(ArrayNodeDefinition $rootNode) |
|
456 | |||
457 | 84 | private function addExceptionSection(ArrayNodeDefinition $rootNode) |
|
458 | { |
||
459 | $rootNode |
||
568 | |||
569 | 16 | private function testExceptionExists(string $throwable) |
|
575 | } |
||
576 |
This method has been deprecated. The supplier of the class has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.