Manager.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. /**
  3. * Event manager
  4. * Used to dispatch global events
  5. *
  6. * Copyright © Magento, Inc. All rights reserved.
  7. * See COPYING.txt for license details.
  8. */
  9. namespace Magento\Framework\Event;
  10. class Manager implements ManagerInterface
  11. {
  12. /**
  13. * Events cache
  14. *
  15. * @var array
  16. */
  17. protected $_events = [];
  18. /**
  19. * Event invoker
  20. *
  21. * @var InvokerInterface
  22. */
  23. protected $_invoker;
  24. /**
  25. * Event config
  26. *
  27. * @var ConfigInterface
  28. */
  29. protected $_eventConfig;
  30. /**
  31. * @param InvokerInterface $invoker
  32. * @param ConfigInterface $eventConfig
  33. */
  34. public function __construct(InvokerInterface $invoker, ConfigInterface $eventConfig)
  35. {
  36. $this->_invoker = $invoker;
  37. $this->_eventConfig = $eventConfig;
  38. }
  39. /**
  40. * Dispatch event
  41. *
  42. * Calls all observer callbacks registered for this event
  43. * and multiple observers matching event name pattern
  44. *
  45. * @param string $eventName
  46. * @param array $data
  47. * @return void
  48. */
  49. public function dispatch($eventName, array $data = [])
  50. {
  51. $eventName = mb_strtolower($eventName);
  52. \Magento\Framework\Profiler::start('EVENT:' . $eventName, ['group' => 'EVENT', 'name' => $eventName]);
  53. foreach ($this->_eventConfig->getObservers($eventName) as $observerConfig) {
  54. $event = new \Magento\Framework\Event($data);
  55. $event->setName($eventName);
  56. $wrapper = new Observer();
  57. $wrapper->setData(array_merge(['event' => $event], $data));
  58. \Magento\Framework\Profiler::start('OBSERVER:' . $observerConfig['name']);
  59. $this->_invoker->dispatch($observerConfig, $wrapper);
  60. \Magento\Framework\Profiler::stop('OBSERVER:' . $observerConfig['name']);
  61. }
  62. \Magento\Framework\Profiler::stop('EVENT:' . $eventName);
  63. }
  64. }