EventEmitterTrait.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php declare(strict_types=1);
  2. /*
  3. * This file is part of Evenement.
  4. *
  5. * (c) Igor Wiedler <igor@wiedler.ch>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Evenement;
  11. use InvalidArgumentException;
  12. trait EventEmitterTrait
  13. {
  14. protected $listeners = [];
  15. protected $onceListeners = [];
  16. public function on($event, callable $listener)
  17. {
  18. if ($event === null) {
  19. throw new InvalidArgumentException('event name must not be null');
  20. }
  21. if (!isset($this->listeners[$event])) {
  22. $this->listeners[$event] = [];
  23. }
  24. $this->listeners[$event][] = $listener;
  25. return $this;
  26. }
  27. public function once($event, callable $listener)
  28. {
  29. if ($event === null) {
  30. throw new InvalidArgumentException('event name must not be null');
  31. }
  32. if (!isset($this->onceListeners[$event])) {
  33. $this->onceListeners[$event] = [];
  34. }
  35. $this->onceListeners[$event][] = $listener;
  36. return $this;
  37. }
  38. public function removeListener($event, callable $listener)
  39. {
  40. if ($event === null) {
  41. throw new InvalidArgumentException('event name must not be null');
  42. }
  43. if (isset($this->listeners[$event])) {
  44. $index = \array_search($listener, $this->listeners[$event], true);
  45. if (false !== $index) {
  46. unset($this->listeners[$event][$index]);
  47. if (\count($this->listeners[$event]) === 0) {
  48. unset($this->listeners[$event]);
  49. }
  50. }
  51. }
  52. if (isset($this->onceListeners[$event])) {
  53. $index = \array_search($listener, $this->onceListeners[$event], true);
  54. if (false !== $index) {
  55. unset($this->onceListeners[$event][$index]);
  56. if (\count($this->onceListeners[$event]) === 0) {
  57. unset($this->onceListeners[$event]);
  58. }
  59. }
  60. }
  61. }
  62. public function removeAllListeners($event = null)
  63. {
  64. if ($event !== null) {
  65. unset($this->listeners[$event]);
  66. } else {
  67. $this->listeners = [];
  68. }
  69. if ($event !== null) {
  70. unset($this->onceListeners[$event]);
  71. } else {
  72. $this->onceListeners = [];
  73. }
  74. }
  75. public function listeners($event = null): array
  76. {
  77. if ($event === null) {
  78. $events = [];
  79. $eventNames = \array_unique(
  80. \array_merge(\array_keys($this->listeners), \array_keys($this->onceListeners))
  81. );
  82. foreach ($eventNames as $eventName) {
  83. $events[$eventName] = \array_merge(
  84. isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [],
  85. isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : []
  86. );
  87. }
  88. return $events;
  89. }
  90. return \array_merge(
  91. isset($this->listeners[$event]) ? $this->listeners[$event] : [],
  92. isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : []
  93. );
  94. }
  95. public function emit($event, array $arguments = [])
  96. {
  97. if ($event === null) {
  98. throw new InvalidArgumentException('event name must not be null');
  99. }
  100. if (isset($this->listeners[$event])) {
  101. foreach ($this->listeners[$event] as $listener) {
  102. $listener(...$arguments);
  103. }
  104. }
  105. if (isset($this->onceListeners[$event])) {
  106. $listeners = $this->onceListeners[$event];
  107. unset($this->onceListeners[$event]);
  108. foreach ($listeners as $listener) {
  109. $listener(...$arguments);
  110. }
  111. }
  112. }
  113. }