AttributeProvider.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Model\EntitySnapshot;
  7. use Magento\Framework\EntityManager\MetadataPool;
  8. use Magento\Framework\ObjectManagerInterface as ObjectManager;
  9. /**
  10. * Class EntitySnapshot
  11. */
  12. class AttributeProvider implements AttributeProviderInterface
  13. {
  14. /**
  15. * @var AttributeProviderInterface[]
  16. */
  17. protected $providers;
  18. /**
  19. * @var MetadataPool
  20. */
  21. protected $metadataPool;
  22. /**
  23. * @var ObjectManager
  24. */
  25. protected $objectManager;
  26. /**
  27. * @var array
  28. */
  29. protected $registry;
  30. /**
  31. * @param MetadataPool $metadataPool
  32. * @param ObjectManager $objectManager
  33. * @param array $providers
  34. */
  35. public function __construct(
  36. MetadataPool $metadataPool,
  37. ObjectManager $objectManager,
  38. $providers = []
  39. ) {
  40. $this->metadataPool = $metadataPool;
  41. $this->objectManager = $objectManager;
  42. $this->providers = $providers;
  43. }
  44. /**
  45. * Returns array of fields
  46. *
  47. * @param string $entityType
  48. * @return array
  49. * @throws \Exception
  50. */
  51. public function getAttributes($entityType)
  52. {
  53. if (!isset($this->registry[$entityType])) {
  54. $metadata = $this->metadataPool->getMetadata($entityType);
  55. $this->registry[$entityType] = $metadata->getEntityConnection()->describeTable($metadata->getEntityTable());
  56. if ($metadata->getLinkField() != $metadata->getIdentifierField()) {
  57. unset($this->registry[$entityType][$metadata->getLinkField()]);
  58. }
  59. $providers = [];
  60. if (isset($this->providers[$entityType])) {
  61. $providers = $this->providers[$entityType];
  62. } elseif (isset($this->providers['default'])) {
  63. $providers = $this->providers['default'];
  64. }
  65. foreach ($providers as $providerClass) {
  66. $provider = $this->objectManager->get($providerClass);
  67. $this->registry[$entityType] = array_merge(
  68. $this->registry[$entityType],
  69. $provider->getAttributes($entityType)
  70. );
  71. }
  72. }
  73. return $this->registry[$entityType];
  74. }
  75. }