/**
  * 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;
 }
 /**
  * @param bool $isPermissionAllowed
  * @param array $expectedValue
  * @dataProvider buildOutputDataArrayWithPermissionProvider
  */
 public function testBuildOutputDataArrayWithPermission($isPermissionAllowed, $expectedValue)
 {
     $dataObject = new \Magento\Framework\Reflection\Test\Unit\ExtensionAttributesObject();
     $dataObjectType = 'Magento\\Framework\\Reflection\\Test\\Unit\\ExtensionAttributesObject';
     $methodName = 'getAttrName';
     $attributeName = 'attr_name';
     $attributeValue = 'attrName';
     $this->methodsMapProcessorMock->expects($this->once())->method('getMethodsMap')->with($dataObjectType)->will($this->returnValue([$methodName => []]));
     $this->methodsMapProcessorMock->expects($this->once())->method('isMethodValidForDataField')->with($dataObjectType, $methodName)->will($this->returnValue(true));
     $this->fieldNamerMock->expects($this->once())->method('getFieldNameForMethodName')->with($methodName)->will($this->returnValue($attributeName));
     $permissionName = 'Magento_Permission';
     $this->configReaderMock->expects($this->once())->method('read')->will($this->returnValue([$dataObjectType => [$attributeName => [Converter::RESOURCE_PERMISSIONS => [$permissionName]]]]));
     $this->authorizationMock->expects($this->once())->method('isAllowed')->with($permissionName)->will($this->returnValue($isPermissionAllowed));
     if ($isPermissionAllowed) {
         $this->methodsMapProcessorMock->expects($this->once())->method('getMethodReturnType')->with($dataObjectType, $methodName)->will($this->returnValue('string'));
         $this->typeCasterMock->expects($this->once())->method('castValueToType')->with($attributeValue, 'string')->will($this->returnValue($attributeValue));
     }
     $value = $this->model->buildOutputDataArray($dataObject, $dataObjectType);
     $this->assertEquals($value, $expectedValue);
 }
 /**
  * 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;
 }
Beispiel #4
0
 /**
  * Determines if the given method's on the given type is suitable for an output data array.
  *
  * @param string $type
  * @param string $methodName
  * @return bool
  */
 public function isMethodValidForDataField($type, $methodName)
 {
     $methods = $this->getMethodsMap($type);
     if (isset($methods[$methodName])) {
         $methodMetadata = $methods[$methodName];
         // any method with parameter(s) gets ignored because we do not know the type and value of
         // the parameter(s), so we are not able to process
         if ($methodMetadata['parameterCount'] > 0) {
             return false;
         }
         return $this->fieldNamer->getFieldNameForMethodName($methodName) !== null;
     }
     return false;
 }
 /**
  * @param string $methodName
  * @param string $expectedName
  * @dataProvider methodNameProvider
  */
 public function testGetFieldNameForMethodName($methodName, $expectedName)
 {
     $value = $this->model->getFieldNameForMethodName($methodName);
     $this->assertEquals($value, $expectedName);
 }