AttributeMetadataHydrator.php 3.8 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Customer\Model\Metadata;

use Magento\Customer\Api\Data\AttributeMetadataInterface;
use Magento\Customer\Api\Data\AttributeMetadataInterfaceFactory;
use Magento\Customer\Api\Data\OptionInterface;
use Magento\Customer\Api\Data\OptionInterfaceFactory;
use Magento\Customer\Api\Data\ValidationRuleInterface;
use Magento\Customer\Api\Data\ValidationRuleInterfaceFactory;
use Magento\Customer\Model\Data\AttributeMetadata;
use Magento\Framework\Reflection\DataObjectProcessor;

/**
 * Hydrator for AttributeMetadataInterface
 */
class AttributeMetadataHydrator
{
    /**
     * @var AttributeMetadataInterfaceFactory
     */
    private $attributeMetadataFactory;

    /**
     * @var OptionInterfaceFactory
     */
    private $optionFactory;

    /**
     * @var ValidationRuleInterfaceFactory
     */
    private $validationRuleFactory;

    /**
     * @var DataObjectProcessor
     */
    private $dataObjectProcessor;

    /**
     * Constructor
     *
     * @param AttributeMetadataInterfaceFactory $attributeMetadataFactory
     * @param OptionInterfaceFactory $optionFactory
     * @param ValidationRuleInterfaceFactory $validationRuleFactory
     * @param DataObjectProcessor $dataObjectProcessor
     */
    public function __construct(
        AttributeMetadataInterfaceFactory $attributeMetadataFactory,
        OptionInterfaceFactory $optionFactory,
        ValidationRuleInterfaceFactory $validationRuleFactory,
        DataObjectProcessor $dataObjectProcessor
    ) {
        $this->attributeMetadataFactory = $attributeMetadataFactory;
        $this->optionFactory = $optionFactory;
        $this->validationRuleFactory = $validationRuleFactory;
        $this->dataObjectProcessor = $dataObjectProcessor;
    }

    /**
     * Convert array to AttributeMetadataInterface
     *
     * @param array $data
     * @return AttributeMetadataInterface
     */
    public function hydrate(array $data)
    {
        if (isset($data[AttributeMetadataInterface::OPTIONS])) {
            $data[AttributeMetadataInterface::OPTIONS] = $this->createOptions(
                $data[AttributeMetadataInterface::OPTIONS]
            );
        }
        if (isset($data[AttributeMetadataInterface::VALIDATION_RULES])) {
            $data[AttributeMetadataInterface::VALIDATION_RULES] = $this->createValidationRules(
                $data[AttributeMetadataInterface::VALIDATION_RULES]
            );
        }
        return $this->attributeMetadataFactory->create(['data' => $data]);
    }

    /**
     * Populate options with data
     *
     * @param array $data
     * @return OptionInterface[]
     */
    private function createOptions(array $data)
    {
        foreach ($data as $key => $optionData) {
            if (isset($optionData[OptionInterface::OPTIONS])) {
                $optionData[OptionInterface::OPTIONS] = $this->createOptions($optionData[OptionInterface::OPTIONS]);
            }
            $data[$key] = $this->optionFactory->create(['data' => $optionData]);
        }
        return $data;
    }

    /**
     * Populate validation rules with data
     *
     * @param array $data
     * @return ValidationRuleInterface[]
     */
    private function createValidationRules(array $data)
    {
        foreach ($data as $key => $validationRuleData) {
            $data[$key] = $this->validationRuleFactory->create(['data' => $validationRuleData]);
        }
        return $data;
    }

    /**
     * Convert AttributeMetadataInterface to array
     *
     * @param AttributeMetadataInterface $attributeMetadata
     * @return array
     */
    public function extract($attributeMetadata)
    {
        return $this->dataObjectProcessor->buildOutputDataArray(
            $attributeMetadata,
            AttributeMetadata::class
        );
    }
}