CompositeReader.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\MessageQueue\Config;
  7. use Magento\Framework\Config\ReaderInterface;
  8. use Magento\Framework\Phrase;
  9. /**
  10. * Composite reader for communication config.
  11. */
  12. class CompositeReader implements ReaderInterface
  13. {
  14. /**
  15. * @var ReaderInterface[]
  16. */
  17. private $readers;
  18. /**
  19. * Initialize dependencies.
  20. *
  21. * @param array $readers
  22. */
  23. public function __construct(array $readers)
  24. {
  25. $this->readers = [];
  26. $readers = $this->sortReaders($readers);
  27. foreach ($readers as $name => $readerInfo) {
  28. if (!isset($readerInfo['reader']) || !($readerInfo['reader'] instanceof ReaderInterface)) {
  29. throw new \InvalidArgumentException(
  30. new Phrase(
  31. 'Reader [%name] must implement Magento\Framework\Config\ReaderInterface',
  32. ['name' => $name]
  33. )
  34. );
  35. }
  36. $this->readers[] = $readerInfo['reader'];
  37. }
  38. }
  39. /**
  40. * Read config.
  41. *
  42. * @param string|null $scope
  43. * @return array
  44. */
  45. public function read($scope = null)
  46. {
  47. $result = [];
  48. foreach ($this->readers as $reader) {
  49. $result = array_replace_recursive($result, $reader->read($scope));
  50. }
  51. return $result;
  52. }
  53. /**
  54. * Sort readers according to param 'sortOrder'
  55. *
  56. * @param array $readers
  57. * @return array
  58. */
  59. private function sortReaders(array $readers)
  60. {
  61. usort(
  62. $readers,
  63. function ($firstItem, $secondItem) {
  64. $firstValue = 0;
  65. $secondValue = 0;
  66. if (isset($firstItem['sortOrder'])) {
  67. $firstValue = (int)$firstItem['sortOrder'];
  68. }
  69. if (isset($secondItem['sortOrder'])) {
  70. $secondValue = (int)$secondItem['sortOrder'];
  71. }
  72. return $firstValue <=> $secondValue;
  73. }
  74. );
  75. return $readers;
  76. }
  77. }