123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\Reflection;
- use Magento\Framework\Api\CustomAttributesDataInterface;
- use Magento\Framework\Phrase;
- /**
- * Data object processor for array serialization using class reflection
- *
- * @api
- * @since 100.0.2
- */
- class DataObjectProcessor
- {
- /**
- * @var MethodsMap
- */
- private $methodsMapProcessor;
- /**
- * @var TypeCaster
- */
- private $typeCaster;
- /**
- * @var FieldNamer
- */
- private $fieldNamer;
- /**
- * @var ExtensionAttributesProcessor
- */
- private $extensionAttributesProcessor;
- /**
- * @var CustomAttributesProcessor
- */
- private $customAttributesProcessor;
- /**
- * @var array
- */
- private $processors;
- /**
- * @param MethodsMap $methodsMapProcessor
- * @param TypeCaster $typeCaster
- * @param FieldNamer $fieldNamer
- * @param CustomAttributesProcessor $customAttributesProcessor
- * @param ExtensionAttributesProcessor $extensionAttributesProcessor
- * @param array $processors
- */
- public function __construct(
- MethodsMap $methodsMapProcessor,
- TypeCaster $typeCaster,
- FieldNamer $fieldNamer,
- CustomAttributesProcessor $customAttributesProcessor,
- ExtensionAttributesProcessor $extensionAttributesProcessor,
- array $processors = []
- ) {
- $this->methodsMapProcessor = $methodsMapProcessor;
- $this->typeCaster = $typeCaster;
- $this->fieldNamer = $fieldNamer;
- $this->extensionAttributesProcessor = $extensionAttributesProcessor;
- $this->customAttributesProcessor = $customAttributesProcessor;
- $this->processors = $processors;
- }
- /**
- * 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 = [];
- 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);
- if (empty($value)) {
- continue;
- }
- } 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;
- }
- $outputData = $this->changeOutputArray($dataObject, $outputData);
- return $outputData;
- }
- /**
- * Change output array if needed.
- *
- * @param mixed $dataObject
- * @param array $outputData
- * @return array
- */
- private function changeOutputArray($dataObject, array $outputData): array
- {
- foreach ($this->processors as $dataObjectClassName => $processor) {
- if ($dataObject instanceof $dataObjectClassName) {
- $outputData = $processor->execute($dataObject, $outputData);
- }
- }
- return $outputData;
- }
- }
|