/**
  * Use class reflection on given data interface to build output data array
  *
  * @param mixed $dataObject
  * @param string $dataObjectType
  * @return array
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  */
 public function buildOutputDataArray($dataObject, $dataObjectType)
 {
     $methods = $this->methodsMapProcessor->getMethodsMap($dataObjectType);
     $outputData = [];
     /** @var MethodReflection $method */
     foreach (array_keys($methods) as $methodName) {
         if (!$this->methodsMapProcessor->isMethodValidForDataField($dataObjectType, $methodName)) {
             continue;
         }
         $value = $dataObject->{$methodName}();
         $isMethodReturnValueRequired = $this->methodsMapProcessor->isMethodReturnValueRequired($dataObjectType, $methodName);
         if ($value === null && !$isMethodReturnValueRequired) {
             continue;
         }
         $returnType = $this->methodsMapProcessor->getMethodReturnType($dataObjectType, $methodName);
         $key = $this->fieldNamer->getFieldNameForMethodName($methodName);
         if ($key === CustomAttributesDataInterface::CUSTOM_ATTRIBUTES && $value === []) {
             continue;
         }
         if ($key === CustomAttributesDataInterface::CUSTOM_ATTRIBUTES) {
             $value = $this->customAttributesProcessor->buildOutputDataArray($dataObject, $dataObjectType);
         } elseif ($key === "extension_attributes") {
             $value = $this->extensionAttributesProcessor->buildOutputDataArray($value, $returnType);
         } else {
             if (is_object($value) && !$value instanceof Phrase) {
                 $value = $this->buildOutputDataArray($value, $returnType);
             } elseif (is_array($value)) {
                 $valueResult = [];
                 $arrayElementType = substr($returnType, 0, -2);
                 foreach ($value as $singleValue) {
                     if (is_object($singleValue) && !$singleValue instanceof Phrase) {
                         $singleValue = $this->buildOutputDataArray($singleValue, $arrayElementType);
                     }
                     $valueResult[] = $this->typeCaster->castValueToType($singleValue, $arrayElementType);
                 }
                 $value = $valueResult;
             } else {
                 $value = $this->typeCaster->castValueToType($value, $returnType);
             }
         }
         $outputData[$key] = $value;
     }
     return $outputData;
 }
예제 #2
0
 /**
  * Ensure that specified type is either a simple type or a valid service data type.
  *
  * @param string $typeName
  * @return $this
  * @throws \Exception In case when type is invalid
  */
 protected function validateType($typeName)
 {
     if ($this->typeProcessor->isTypeSimple($typeName)) {
         return $this;
     }
     if ($this->typeProcessor->isArrayType($typeName)) {
         $arrayItemType = $this->typeProcessor->getArrayItemType($typeName);
         $this->methodsMap->getMethodsMap($arrayItemType);
     } else {
         $this->methodsMap->getMethodsMap($typeName);
     }
     return $this;
 }
 /**
  * Writes out the extension attributes in an array.
  *
  * @param ExtensionAttributeInterface $dataObject
  * @param string $dataObjectType
  * @return array
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  */
 public function buildOutputDataArray(ExtensionAttributesInterface $dataObject, $dataObjectType)
 {
     $methods = $this->methodsMapProcessor->getMethodsMap($dataObjectType);
     $outputData = [];
     /** @var MethodReflection $method */
     foreach (array_keys($methods) as $methodName) {
         if (!$this->methodsMapProcessor->isMethodValidForDataField($dataObjectType, $methodName)) {
             continue;
         }
         $key = $this->fieldNamer->getFieldNameForMethodName($methodName);
         if ($this->isPermissionChecked && !$this->isAttributePermissionValid($dataObjectType, $key)) {
             continue;
         }
         $value = $dataObject->{$methodName}();
         if ($value === null) {
             // all extension attributes are optional so don't need to check if isRequired
             continue;
         }
         $returnType = $this->methodsMapProcessor->getMethodReturnType($dataObjectType, $methodName);
         if (is_object($value) && !$value instanceof Phrase) {
             $value = $this->dataObjectProcessor->buildOutputDataArray($value, $returnType);
         } elseif (is_array($value)) {
             $valueResult = [];
             $arrayElementType = substr($returnType, 0, -2);
             foreach ($value as $singleValue) {
                 if (is_object($singleValue) && !$singleValue instanceof Phrase) {
                     $singleValue = $this->dataObjectProcessor->buildOutputDataArray($singleValue, $arrayElementType);
                 }
                 $valueResult[] = $this->typeCaster->castValueToType($singleValue, $arrayElementType);
             }
             $value = $valueResult;
         } else {
             $value = $this->typeCaster->castValueToType($value, $returnType);
         }
         $outputData[$key] = $value;
     }
     return $outputData;
 }
예제 #4
0
 public function testGetMethodsMap()
 {
     $methodsMap = $this->model->getMethodsMap('Magento\\Framework\\Reflection\\MethodsMap');
     $this->assertEquals($methodsMap, ['getMethodReturnType' => ['type' => 'string', 'isRequired' => true, 'description' => null, 'parameterCount' => 2], 'getMethodsMap' => ['type' => 'array', 'isRequired' => true, 'description' => "<pre> Service methods' reflection data stored in cache as 'methodName' => " . "'returnType' ex. [ 'create' => '\\Magento\\Customer\\Api\\Data\\Customer', 'validatePassword' " . "=> 'boolean' ] </pre>", 'parameterCount' => 1], 'isMethodValidForDataField' => ['type' => 'bool', 'isRequired' => true, 'description' => null, 'parameterCount' => 2], 'isMethodReturnValueRequired' => ['type' => 'bool', 'isRequired' => true, 'description' => null, 'parameterCount' => 2]]);
 }