PluginProbe
VikBooking Hotel Booking Engine & PMS / trunk
VikBooking Hotel Booking Engine & PMS vtrunk
1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 All 36 releases
vikbooking / admin / helpers / src / event / observer.php

observer.php in VikBooking Hotel Booking Engine & PMS trunk, at admin/helpers/src/event/observer.php

140 lines 3.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package VikBooking
4 * @subpackage core
5 * @author E4J s.r.l.
6 * @copyright Copyright (C) 2025 E4J s.r.l. All Rights Reserved.
7 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
8 * @link https://vikwp.com
9 */
10
11 // No direct access
12 defined('ABSPATH') or die('No script kiddies please!');
13
14 /**
15 * Observer design pattern implementation as trait for a better reusability.
16 *
17 * @since 1.18.15 (J) - 1.8.15 (WP)
18 */
19 trait VBOEventObserver
20 {
21 /**
22 * A list of subscribers, grouped per event.
23 *
24 * @var array
25 */
26 protected $listeners = [];
27
28 /**
29 * Subscribes the provided callback to the given event.
30 *
31 * @param string $event The event to observe.
32 * @param mixed $callback The callback to invoke.
33 *
34 * @return self
35 */
36 public function subscribe(string $event, $callback)
37 {
38 if (!isset($this->listeners[$event]))
39 {
40 // create event repository for the first time
41 $this->listeners[$event] = [];
42 }
43
44 // make sure we have a valid callback
45 if (is_callable($callback))
46 {
47 // generate callback ID
48 $callbackId = $this->getCallbackId($callback);
49
50 // internally register the callback
51 $this->listeners[$event][$callbackId] = $callback;
52 }
53
54 return $this;
55 }
56
57 /**
58 * Unsubscribes the provided callback from the given event.
59 *
60 * @param string $event The observed event.
61 * @param mixed $callback The registered callback.
62 *
63 * @return self
64 */
65 public function unsubscribe(string $event, $callback)
66 {
67 // make sure we have a valid callback
68 if (is_callable($callback))
69 {
70 // generate callback ID
71 $callbackId = $this->getCallbackId($callback);
72
73 // unset registered callback, if any
74 if (isset($this->listeners[$event][$callbackId]))
75 {
76 unset($this->listeners[$event][$callbackId]);
77 }
78 }
79
80 return $this;
81 }
82
83 /**
84 * Notifies all the subscribers when a certain event is triggered.
85 *
86 * @param string $event The fired event.
87 * @param mixed ...$args Arguments to pass to the function.
88 *
89 * @return A list of return values.
90 */
91 public function notify(string $event, &...$args)
92 {
93 $return = [];
94
95 // iterate all the event subscribers
96 foreach ($this->listeners[$event] ?? [] as $callback)
97 {
98 // invoke callback function and register returned value
99 $return[] = call_user_func_array($callback, $args);
100 }
101
102 // get rid of NULL values
103 return array_values(array_filter($return, fn($v) => $v !== null));
104 }
105
106 /**
107 * Generates a unique and reusable identifier according to the provided callback.
108 *
109 * @param mixed $callback The registered callback.
110 *
111 * @return string
112 */
113 private function getCallbackId($callback)
114 {
115 if ($callback instanceof \Closure || is_object($callback))
116 {
117 return spl_object_hash($callback);
118 }
119
120 if (is_string($callback))
121 {
122 return $callback;
123 }
124
125 if (is_array($callback))
126 {
127 [$target, $method] = $callback;
128
129 if (is_object($target))
130 {
131 return spl_object_hash($target) . '::' . $method;
132 }
133
134 return $target . '::' . $method;
135 }
136
137 throw new \InvalidArgumentException('Invalid callback provided.', 400);
138 }
139 }
140