Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ParamsOverrider.php
Go to the documentation of this file.
1 <?php
8 
13 
18 {
22  private $paramOverriders;
23 
27  private $methodsMap;
28 
34  public function __construct(
35  array $paramOverriders = []
36  ) {
37  $this->paramOverriders = $paramOverriders;
38  }
39 
47  public function override(array $inputData, array $parameters)
48  {
49  foreach ($parameters as $name => $paramData) {
50  $arrayKeys = explode('.', $name);
51  if ($paramData[Converter::KEY_FORCE] || !$this->isNestedArrayValueSet($inputData, $arrayKeys)) {
52  $paramValue = $paramData[Converter::KEY_VALUE];
53  if (isset($this->paramOverriders[$paramValue])) {
54  $value = $this->paramOverriders[$paramValue]->getOverriddenValue();
55  } else {
56  $value = $paramData[Converter::KEY_VALUE];
57  }
58  $this->setNestedArrayValue($inputData, $arrayKeys, $value);
59  }
60  }
61  return $inputData;
62  }
63 
71  protected function isNestedArrayValueSet(&$nestedArray, $arrayKeys)
72  {
73  $currentArray = &$nestedArray;
74 
75  foreach ($arrayKeys as $key) {
76  if (!isset($currentArray[$key])) {
77  return false;
78  }
79  $currentArray = &$currentArray[$key];
80  }
81  return true;
82  }
83 
92  protected function setNestedArrayValue(&$nestedArray, $arrayKeys, $valueToSet)
93  {
94  $currentArray = &$nestedArray;
95  $lastKey = array_pop($arrayKeys);
96 
97  foreach ($arrayKeys as $key) {
98  if (!isset($currentArray[$key])) {
99  $currentArray[$key] = [];
100  }
101  $currentArray = &$currentArray[$key];
102  }
103 
104  $currentArray[$lastKey] = $valueToSet;
105  }
106 
126  array $urlPathParams,
127  array $requestBodyParams,
128  $serviceClassName,
129  $serviceMethodName
130  ) {
131  if (empty($urlPathParams)) {
132  return $requestBodyParams;
133  }
134  $pathParamValue = end($urlPathParams);
135  // Self apis should not be overridden
136  if ($pathParamValue === 'me') {
137  return $requestBodyParams;
138  }
139  $pathParamKey = key($urlPathParams);
140  // Check if the request data is a top level object of body
141  if (count($requestBodyParams) == 1 && is_array(end($requestBodyParams))) {
142  $requestDataKey = key($requestBodyParams);
143  if ($this->isPropertyDeclaredInDataObject(
144  $serviceClassName,
145  $serviceMethodName,
146  $requestDataKey,
147  $pathParamKey
148  )
149  ) {
150  $this->substituteParameters($requestBodyParams[$requestDataKey], $pathParamKey, $pathParamValue);
151  } else {
152  $this->substituteParameters($requestBodyParams, $pathParamKey, $pathParamValue);
153  }
154  } else { // Else parameters passed as scalar values in body will be overridden
155  $this->substituteParameters($requestBodyParams, $pathParamKey, $pathParamValue);
156  }
157  return $requestBodyParams;
158  }
159 
168  private function substituteParameters(array &$requestData, $key, $value)
169  {
170  $snakeCaseKey = SimpleDataObjectConverter::camelCaseToSnakeCase($key);
171  $camelCaseKey = SimpleDataObjectConverter::snakeCaseToCamelCase($key);
172 
173  if (isset($requestData[$camelCaseKey])) {
174  $requestData[$camelCaseKey] = $value;
175  } else {
176  $requestData[$snakeCaseKey] = $value;
177  }
178  }
179 
189  private function isPropertyDeclaredInDataObject(
190  $serviceClassName,
191  $serviceMethodName,
192  $serviceMethodParamName,
193  $objectProperty
194  ) {
195  if ($serviceClassName && $serviceMethodName) {
196  $methodParams = $this->getMethodsMap()->getMethodParams($serviceClassName, $serviceMethodName);
197  $index = array_search($serviceMethodParamName, array_column($methodParams, 'name'));
198  if ($index !== false) {
199  $paramObjectType = $methodParams[$index][MethodsMap::METHOD_META_TYPE];
200  $setter = 'set' . ucfirst(SimpleDataObjectConverter::snakeCaseToCamelCase($objectProperty));
201  if (array_key_exists(
202  $setter,
203  $this->getMethodsMap()->getMethodsMap($paramObjectType)
204  )) {
205  return true;
206  }
207  }
208  }
209  return false;
210  }
211 
219  private function getMethodsMap()
220  {
221  if ($this->methodsMap === null) {
223  ->get(MethodsMap::class);
224  }
225  return $this->methodsMap;
226  }
227 }
setNestedArrayValue(&$nestedArray, $arrayKeys, $valueToSet)
$value
Definition: gender.phtml:16
isNestedArrayValueSet(&$nestedArray, $arrayKeys)
overrideRequestBodyIdWithPathParam(array $urlPathParams, array $requestBodyParams, $serviceClassName, $serviceMethodName)
$index
Definition: list.phtml:44
if(!isset($_GET['name'])) $name
Definition: log.php:14