Skip to content

Commit d20cbc4

Browse files
committed
Merge pull request #1034 from FriendsOfSymfony/is_decodeable
Make it possible to override listener services, add extension point to body listener
2 parents 7cb532f + a3ee6d7 commit d20cbc4

File tree

5 files changed

+235
-71
lines changed

5 files changed

+235
-71
lines changed

DependencyInjection/Configuration.php

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*/
2727
class Configuration implements ConfigurationInterface
2828
{
29-
private $forceOptionValues = array(false, true, 'force');
29+
public static $forceOptionValues = array(false, true, 'force');
3030

3131
/**
3232
* Generates the configuration tree.
@@ -42,18 +42,37 @@ public function getConfigTreeBuilder()
4242
->children()
4343
->scalarNode('disable_csrf_role')->defaultNull()->end()
4444
->arrayNode('access_denied_listener')
45-
->useAttributeAsKey('name')
46-
->prototype('boolean')->end()
45+
->canBeEnabled()
46+
->beforeNormalization()
47+
->ifArray()->then(function($v) { if (!empty($v) && empty($v['formats'])) { unset($v['enabled']); $v = array('enabled' => true, 'formats' => $v); } return $v; })
48+
->end()
49+
->fixXmlConfig('format', 'formats')
50+
->children()
51+
->scalarNode('service')->defaultNull()->end()
52+
->arrayNode('formats')
53+
->useAttributeAsKey('name')
54+
->prototype('boolean')->end()
55+
->end()
56+
->end()
4757
->end()
4858
->scalarNode('unauthorized_challenge')->defaultNull()->end()
49-
->scalarNode('param_fetcher_listener')->defaultFalse()
59+
->arrayNode('param_fetcher_listener')
5060
->validate()
51-
->ifNotInArray($this->forceOptionValues)
52-
->thenInvalid('The param_fetcher_listener option does not support %s. Please choose one of '.json_encode($this->forceOptionValues))
61+
->ifNotInArray(Configuration::$forceOptionValues)
62+
->thenInvalid('The param_fetcher_listener option does not support %s. Please choose one of '.json_encode(Configuration::$forceOptionValues))
63+
->end()
64+
->canBeEnabled()
65+
->children()
66+
->scalarNode('service')->defaultNull()->end()
5367
->end()
5468
->end()
5569
->scalarNode('cache_dir')->cannotBeEmpty()->defaultValue('%kernel.cache_dir%/fos_rest')->end()
56-
->scalarNode('allowed_methods_listener')->defaultFalse()->end()
70+
->arrayNode('allowed_methods_listener')
71+
->canBeEnabled()
72+
->children()
73+
->scalarNode('service')->defaultNull()->end()
74+
->end()
75+
->end()
5776
->arrayNode('routing_loader')
5877
->addDefaultsIfNotSet()
5978
->children()
@@ -124,8 +143,18 @@ private function addViewSection(ArrayNodeDefinition $rootNode)
124143
->prototype('boolean')->end()
125144
->end()
126145
->arrayNode('mime_types')
127-
->useAttributeAsKey('name')
128-
->prototype('variable')->end()
146+
->canBeEnabled()
147+
->beforeNormalization()
148+
->ifArray()->then(function($v) { if (!empty($v) && empty($v['formats'])) { unset($v['enabled']); $v = array('enabled' => true, 'formats' => $v); } return $v; })
149+
->end()
150+
->fixXmlConfig('format', 'formats')
151+
->children()
152+
->scalarNode('service')->defaultNull()->end()
153+
->arrayNode('formats')
154+
->useAttributeAsKey('name')
155+
->prototype('variable')->end()
156+
->end()
157+
->end()
129158
->end()
130159
->arrayNode('formats')
131160
->useAttributeAsKey('name')
@@ -137,10 +166,18 @@ private function addViewSection(ArrayNodeDefinition $rootNode)
137166
->defaultValue(array('html' => true))
138167
->prototype('boolean')->end()
139168
->end()
140-
->scalarNode('view_response_listener')->defaultFalse()
169+
->arrayNode('view_response_listener')
170+
->beforeNormalization()
171+
->ifString()->then(function($v) { return array('enabled' => true, 'mode' => $v); })
172+
->end()
141173
->validate()
142-
->ifNotInArray($this->forceOptionValues)
143-
->thenInvalid('The view_response_listener option does not support %s. Please choose one of '.json_encode($this->forceOptionValues))
174+
->ifTrue(function ($v) { return !in_array($v['mode'], Configuration::$forceOptionValues); })
175+
->thenInvalid('The view_response_listener "mode" does not support %s. Please choose one of '.json_encode(Configuration::$forceOptionValues))
176+
->end()
177+
->canBeEnabled()
178+
->children()
179+
->scalarNode('service')->defaultNull()->end()
180+
->scalarNode('mode')->defaultFalse()->end()
144181
->end()
145182
->end()
146183
->scalarNode('failed_validation')->defaultValue(Codes::HTTP_BAD_REQUEST)->end()
@@ -168,7 +205,9 @@ private function addBodyListenerSection(ArrayNodeDefinition $rootNode)
168205
->fixXmlConfig('decoder', 'decoders')
169206
->addDefaultsIfNotSet()
170207
->canBeUnset()
208+
->canBeDisabled()
171209
->children()
210+
->scalarNode('service')->defaultNull()->end()
172211
->scalarNode('default_format')->defaultNull()->end()
173212
->booleanNode('throw_exception_on_unsupported_content_type')
174213
->defaultFalse()
@@ -213,7 +252,9 @@ private function addFormatListenerSection(ArrayNodeDefinition $rootNode)
213252
return $v;
214253
})
215254
->end()
255+
->canBeEnabled()
216256
->children()
257+
->scalarNode('service')->defaultNull()->end()
217258
->arrayNode('rules')
218259
->cannotBeOverwritten()
219260
->prototype('array')
@@ -235,8 +276,15 @@ private function addFormatListenerSection(ArrayNodeDefinition $rootNode)
235276
->end()
236277
->arrayNode('media_type')
237278
->children()
238-
->scalarNode('version_regex')
239-
->defaultValue('/(v|version)=(?P<version>[0-9\.]+)/')
279+
->arrayNode('version_regex')
280+
->canBeEnabled()
281+
->beforeNormalization()
282+
->ifString()->then(function($v) { return array('enabled' => true, 'regex' => $v); })
283+
->end()
284+
->children()
285+
->scalarNode('service')->defaultNull()->end()
286+
->scalarNode('regex')->defaultValue('/(v|version)=(?P<version>[0-9\.]+)/')->end()
287+
->end()
240288
->end()
241289
->end()
242290
->end()

0 commit comments

Comments
 (0)