6
6
7
7
namespace Magento \Webapi \Controller \Rest ;
8
8
9
+ use Magento \Framework \App \ObjectManager ;
9
10
use Magento \Framework \Webapi \Rest \Request \ParamOverriderInterface ;
10
11
use Magento \Webapi \Model \Config \Converter ;
11
12
use Magento \Framework \Reflection \MethodsMap ;
@@ -26,15 +27,24 @@ class ParamsOverrider
26
27
*/
27
28
private $ methodsMap ;
28
29
30
+ /**
31
+ * @var SimpleDataObjectConverter
32
+ */
33
+ private $ dataObjectConverter ;
34
+
29
35
/**
30
36
* Initialize dependencies
31
37
*
32
38
* @param ParamOverriderInterface[] $paramOverriders
39
+ * @param SimpleDataObjectConverter|null $dataObjectConverter
33
40
*/
34
41
public function __construct (
35
- array $ paramOverriders = []
42
+ array $ paramOverriders = [],
43
+ SimpleDataObjectConverter $ dataObjectConverter = null
36
44
) {
37
45
$ this ->paramOverriders = $ paramOverriders ;
46
+ $ this ->dataObjectConverter = $ dataObjectConverter
47
+ ?: ObjectManager::getInstance ()->get (SimpleDataObjectConverter::class);
38
48
}
39
49
40
50
/**
@@ -48,7 +58,7 @@ public function override(array $inputData, array $parameters)
48
58
{
49
59
foreach ($ parameters as $ name => $ paramData ) {
50
60
$ arrayKeys = explode ('. ' , $ name );
51
- if ($ paramData [Converter::KEY_FORCE ] || !$ this ->isNestedArrayValueSet ($ inputData , $ arrayKeys )) {
61
+ if (/* $paramData[Converter::KEY_FORCE] || */ !$ this ->isNestedArrayValueSet ($ inputData , $ arrayKeys )) {
52
62
$ paramValue = $ paramData [Converter::KEY_VALUE ];
53
63
if (isset ($ this ->paramOverriders [$ paramValue ])) {
54
64
$ value = $ this ->paramOverriders [$ paramValue ]->getOverriddenValue ();
@@ -64,15 +74,17 @@ public function override(array $inputData, array $parameters)
64
74
/**
65
75
* Determine if a nested array value is set.
66
76
*
67
- * @param array & $nestedArray
77
+ * @param array $nestedArray
68
78
* @param string[] $arrayKeys
69
79
* @return bool true if array value is set
70
80
*/
71
- protected function isNestedArrayValueSet (& $ nestedArray , $ arrayKeys )
81
+ protected function isNestedArrayValueSet ($ nestedArray , $ arrayKeys )
72
82
{
73
- $ currentArray = &$ nestedArray ;
83
+ //Converting input data to camelCase in order to process both snake and camel style data equally.
84
+ $ currentArray = $ this ->dataObjectConverter ->convertKeysToCamelCase ($ nestedArray );
74
85
75
86
foreach ($ arrayKeys as $ key ) {
87
+ $ key = SimpleDataObjectConverter::snakeCaseToCamelCase ($ key );
76
88
if (!isset ($ currentArray [$ key ])) {
77
89
return false ;
78
90
}
@@ -95,12 +107,22 @@ protected function setNestedArrayValue(&$nestedArray, $arrayKeys, $valueToSet)
95
107
$ lastKey = array_pop ($ arrayKeys );
96
108
97
109
foreach ($ arrayKeys as $ key ) {
110
+ if (!array_key_exists ($ key , $ currentArray )) {
111
+ //In case input data uses camelCase format
112
+ $ key = SimpleDataObjectConverter::snakeCaseToCamelCase ($ key );
113
+ }
98
114
if (!isset ($ currentArray [$ key ])) {
99
115
$ currentArray [$ key ] = [];
100
116
}
101
117
$ currentArray = &$ currentArray [$ key ];
102
118
}
103
119
120
+ //In case input data uses camelCase format
121
+ $ camelCaseKey = SimpleDataObjectConverter::snakeCaseToCamelCase ($ lastKey );
122
+ if (array_key_exists ($ camelCaseKey , $ currentArray )) {
123
+ $ lastKey = $ camelCaseKey ;
124
+ }
125
+
104
126
$ currentArray [$ lastKey ] = $ valueToSet ;
105
127
}
106
128
0 commit comments