Collection.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /**
  7. * Collection of events
  8. *
  9. * @author Magento Core Team <core@magentocommerce.com>
  10. */
  11. namespace Magento\Framework\Event;
  12. use Magento\Framework\Event;
  13. class Collection
  14. {
  15. /**
  16. * Array of events in the collection
  17. *
  18. * @var array
  19. */
  20. protected $events;
  21. /**
  22. * Global observers
  23. *
  24. * For example regex observers will watch all events that
  25. *
  26. * @var Observer\Collection
  27. */
  28. protected $globalObservers;
  29. /**
  30. * Initializes global observers collection
  31. *
  32. * @param array $events
  33. * @param Observer\Collection $observerCollection
  34. */
  35. public function __construct(array $events = [], Observer\Collection $observerCollection = null)
  36. {
  37. $this->events = $events;
  38. $this->globalObservers = !$observerCollection ? new Observer\Collection() : $observerCollection;
  39. }
  40. /**
  41. * Returns all registered events in collection
  42. *
  43. * @return array
  44. */
  45. public function getAllEvents()
  46. {
  47. return $this->events;
  48. }
  49. /**
  50. * Returns all registered global observers for the collection of events
  51. *
  52. * @return Observer\Collection
  53. */
  54. public function getGlobalObservers()
  55. {
  56. return $this->globalObservers;
  57. }
  58. /**
  59. * Returns event by its name
  60. *
  61. * If event doesn't exist creates new one and returns it
  62. *
  63. * @param string $eventName
  64. * @return Event
  65. */
  66. public function getEventByName($eventName)
  67. {
  68. if (!isset($this->events[$eventName])) {
  69. $this->addEvent(new Event(['name' => $eventName]));
  70. }
  71. return $this->events[$eventName];
  72. }
  73. /**
  74. * Register an event for this collection
  75. *
  76. * @param Event $event
  77. * @return $this
  78. */
  79. public function addEvent(Event $event)
  80. {
  81. $this->events[$event->getName()] = $event;
  82. return $this;
  83. }
  84. /**
  85. * Register an observer
  86. *
  87. * If observer has event_name property it will be registered for this specific event.
  88. * If not it will be registered as global observer
  89. *
  90. * @param Observer $observer
  91. * @return $this
  92. */
  93. public function addObserver(Observer $observer)
  94. {
  95. $eventName = $observer->getEventName();
  96. if ($eventName) {
  97. $this->getEventByName($eventName)->addObserver($observer);
  98. } else {
  99. $this->getGlobalObservers()->addObserver($observer);
  100. }
  101. return $this;
  102. }
  103. /**
  104. * Dispatch event name with optional data
  105. *
  106. * Will dispatch specific event and will try all global observers
  107. *
  108. * @param string $eventName
  109. * @param array $data
  110. * @return $this
  111. */
  112. public function dispatch($eventName, array $data = [])
  113. {
  114. $event = $this->getEventByName($eventName);
  115. $event->addData($data)->dispatch();
  116. $this->getGlobalObservers()->dispatch($event);
  117. return $this;
  118. }
  119. }