AttributeMetadataHydrator.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Customer\Model\Metadata;
  7. use Magento\Customer\Api\Data\AttributeMetadataInterface;
  8. use Magento\Customer\Api\Data\AttributeMetadataInterfaceFactory;
  9. use Magento\Customer\Api\Data\OptionInterface;
  10. use Magento\Customer\Api\Data\OptionInterfaceFactory;
  11. use Magento\Customer\Api\Data\ValidationRuleInterface;
  12. use Magento\Customer\Api\Data\ValidationRuleInterfaceFactory;
  13. use Magento\Customer\Model\Data\AttributeMetadata;
  14. use Magento\Framework\Reflection\DataObjectProcessor;
  15. /**
  16. * Hydrator for AttributeMetadataInterface
  17. */
  18. class AttributeMetadataHydrator
  19. {
  20. /**
  21. * @var AttributeMetadataInterfaceFactory
  22. */
  23. private $attributeMetadataFactory;
  24. /**
  25. * @var OptionInterfaceFactory
  26. */
  27. private $optionFactory;
  28. /**
  29. * @var ValidationRuleInterfaceFactory
  30. */
  31. private $validationRuleFactory;
  32. /**
  33. * @var DataObjectProcessor
  34. */
  35. private $dataObjectProcessor;
  36. /**
  37. * Constructor
  38. *
  39. * @param AttributeMetadataInterfaceFactory $attributeMetadataFactory
  40. * @param OptionInterfaceFactory $optionFactory
  41. * @param ValidationRuleInterfaceFactory $validationRuleFactory
  42. * @param DataObjectProcessor $dataObjectProcessor
  43. */
  44. public function __construct(
  45. AttributeMetadataInterfaceFactory $attributeMetadataFactory,
  46. OptionInterfaceFactory $optionFactory,
  47. ValidationRuleInterfaceFactory $validationRuleFactory,
  48. DataObjectProcessor $dataObjectProcessor
  49. ) {
  50. $this->attributeMetadataFactory = $attributeMetadataFactory;
  51. $this->optionFactory = $optionFactory;
  52. $this->validationRuleFactory = $validationRuleFactory;
  53. $this->dataObjectProcessor = $dataObjectProcessor;
  54. }
  55. /**
  56. * Convert array to AttributeMetadataInterface
  57. *
  58. * @param array $data
  59. * @return AttributeMetadataInterface
  60. */
  61. public function hydrate(array $data)
  62. {
  63. if (isset($data[AttributeMetadataInterface::OPTIONS])) {
  64. $data[AttributeMetadataInterface::OPTIONS] = $this->createOptions(
  65. $data[AttributeMetadataInterface::OPTIONS]
  66. );
  67. }
  68. if (isset($data[AttributeMetadataInterface::VALIDATION_RULES])) {
  69. $data[AttributeMetadataInterface::VALIDATION_RULES] = $this->createValidationRules(
  70. $data[AttributeMetadataInterface::VALIDATION_RULES]
  71. );
  72. }
  73. return $this->attributeMetadataFactory->create(['data' => $data]);
  74. }
  75. /**
  76. * Populate options with data
  77. *
  78. * @param array $data
  79. * @return OptionInterface[]
  80. */
  81. private function createOptions(array $data)
  82. {
  83. foreach ($data as $key => $optionData) {
  84. if (isset($optionData[OptionInterface::OPTIONS])) {
  85. $optionData[OptionInterface::OPTIONS] = $this->createOptions($optionData[OptionInterface::OPTIONS]);
  86. }
  87. $data[$key] = $this->optionFactory->create(['data' => $optionData]);
  88. }
  89. return $data;
  90. }
  91. /**
  92. * Populate validation rules with data
  93. *
  94. * @param array $data
  95. * @return ValidationRuleInterface[]
  96. */
  97. private function createValidationRules(array $data)
  98. {
  99. foreach ($data as $key => $validationRuleData) {
  100. $data[$key] = $this->validationRuleFactory->create(['data' => $validationRuleData]);
  101. }
  102. return $data;
  103. }
  104. /**
  105. * Convert AttributeMetadataInterface to array
  106. *
  107. * @param AttributeMetadataInterface $attributeMetadata
  108. * @return array
  109. */
  110. public function extract($attributeMetadata)
  111. {
  112. return $this->dataObjectProcessor->buildOutputDataArray(
  113. $attributeMetadata,
  114. AttributeMetadata::class
  115. );
  116. }
  117. }