PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / trunk
Matomo Analytics – Powerful, Privacy-First Insights for WordPress vtrunk
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / EventDispatcher.php
matomo / app / core Last commit date
API 1 month ago Access 3 months ago Application 1 month ago Archive 1 month ago ArchiveProcessor 1 month ago Archiver 2 years ago AssetManager 1 month ago Auth 6 months ago Category 6 months ago Changes 1 month ago CliMulti 1 year ago Columns 1 month ago Concurrency 1 month ago Config 1 month ago Container 1 month ago CronArchive 3 months ago DataAccess 1 month ago DataFiles 2 years ago DataTable 3 weeks ago Db 3 weeks ago DeviceDetector 1 year ago Email 2 years ago Exception 4 months ago Http 4 months ago Intl 3 months ago Log 2 years ago Mail 1 year ago Measurable 6 months ago Menu 1 month ago Metrics 3 months ago Notification 6 months ago Period 1 month ago Plugin 3 weeks ago Policy 1 month ago ProfessionalServices 1 year ago Report 1 year ago ReportRenderer 3 months ago Request 3 months ago Scheduler 1 month ago Segment 1 month ago Session 3 weeks ago Settings 1 month ago Tracker 3 weeks ago Translation 1 month ago Twig 1 year ago UpdateCheck 3 months ago Updater 1 month ago Updates 1 week ago Validators 1 year ago View 1 month ago ViewDataTable 3 weeks ago Visualization 1 year ago Widget 1 month ago .htaccess 2 years ago Access.php 1 month ago Archive.php 1 month ago ArchiveProcessor.php 1 month ago AssetManager.php 1 month ago Auth.php 6 months ago AuthResult.php 6 months ago BaseFactory.php 2 years ago Cache.php 2 years ago CacheId.php 4 months ago CliMulti.php 1 month ago Common.php 3 weeks ago Config.php 1 month ago Console.php 3 months ago Context.php 2 years ago Cookie.php 1 year ago CronArchive.php 1 month ago DI.php 3 months ago DataArray.php 1 month ago DataTable.php 1 month ago Date.php 1 month ago Db.php 1 month ago DbHelper.php 1 month ago Development.php 1 year ago ErrorHandler.php 6 months ago EventDispatcher.php 1 month ago ExceptionHandler.php 4 months ago FileIntegrity.php 1 month ago Filechecks.php 1 year ago Filesystem.php 1 month ago FrontController.php 4 months ago Http.php 1 month ago IP.php 1 year ago Log.php 3 months ago LogDeleter.php 1 year ago Mail.php 1 year ago Metrics.php 1 month ago NoAccessException.php 2 years ago Nonce.php 6 months ago Notification.php 1 month ago NumberFormatter.php 5 months ago Option.php 5 months ago Period.php 1 month ago Piwik.php 1 month ago Plugin.php 1 month ago Process.php 1 month ago Profiler.php 6 months ago ProxyHeaders.php 4 months ago ProxyHttp.php 5 months ago QuickForm2.php 3 months ago RankingQuery.php 1 month ago ReportRenderer.php 1 month ago Request.php 1 month ago Segment.php 1 month ago Sequence.php 6 months ago Session.php 3 weeks ago SettingsPiwik.php 1 month ago SettingsServer.php 1 year ago Singleton.php 2 years ago Site.php 1 month ago SiteContentDetector.php 1 month ago SupportedBrowser.php 2 years ago TCPDF.php 1 year ago Theme.php 1 year ago Timer.php 1 month ago Tracker.php 1 month ago Twig.php 1 month ago Unzip.php 1 year ago UpdateCheck.php 1 month ago Updater.php 1 month ago UpdaterErrorException.php 2 years ago Updates.php 3 months ago Url.php 3 months ago UrlHelper.php 1 month ago Version.php 1 week ago View.php 1 month ago bootstrap.php 1 year ago dispatch.php 2 years ago testMinimumPhpVersion.php 6 months ago
EventDispatcher.php
190 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 namespace Piwik;
10
11 use Piwik\Container\StaticContainer;
12 /**
13 * This class allows code to post events from anywhere in Piwik and for
14 * plugins to associate callbacks to be executed when events are posted.
15 */
16 class EventDispatcher
17 {
18 /**
19 * @return EventDispatcher
20 */
21 public static function getInstance()
22 {
23 return StaticContainer::get('Piwik\\EventDispatcher');
24 }
25 // implementation details for postEvent
26 public const EVENT_CALLBACK_GROUP_FIRST = 0;
27 public const EVENT_CALLBACK_GROUP_SECOND = 1;
28 public const EVENT_CALLBACK_GROUP_THIRD = 2;
29 /**
30 * Array of observers (callbacks attached to events) that are not methods
31 * of plugin classes.
32 *
33 * @var array
34 */
35 private $extraObservers = array();
36 /**
37 * Array storing information for all pending events. Each item in the array
38 * will be an array w/ two elements:
39 *
40 * array(
41 * 'Event.Name', // the event name
42 * array('event', 'parameters') // the parameters to pass to event observers
43 * )
44 *
45 * @var array
46 */
47 private $pendingEvents = array();
48 /**
49 * Plugin\Manager instance used to get list of loaded plugins.
50 *
51 * @var \Piwik\Plugin\Manager
52 */
53 private $pluginManager;
54 private $pluginHooks = array();
55 public static $_SKIP_EVENTS_IN_TESTS = \false;
56 // phpcs:ignore PSR2.Classes.PropertyDeclaration.Underscore
57 public function __construct(\Piwik\Plugin\Manager $pluginManager, array $observers = array())
58 {
59 $this->pluginManager = $pluginManager;
60 foreach ($observers as $observerInfo) {
61 list($eventName, $callback) = $observerInfo;
62 $this->extraObservers[$eventName][] = $callback;
63 }
64 }
65 /**
66 * Triggers an event, executing all callbacks associated with it.
67 *
68 * @param string $eventName The name of the event, ie, API.getReportMetadata.
69 * @param array $params The parameters to pass to each callback when executing.
70 * @param bool $pending Whether this event should be posted again for plugins
71 * loaded after the event is fired.
72 * @param array|null $plugins The plugins to post events to. If null, the event
73 * is posted to all plugins. The elements of this array
74 * can be either the Plugin objects themselves
75 * or their string names.
76 */
77 public function postEvent($eventName, $params, $pending = \false, $plugins = null)
78 {
79 if (self::$_SKIP_EVENTS_IN_TESTS) {
80 return;
81 }
82 if ($pending) {
83 $this->pendingEvents[] = array($eventName, $params);
84 }
85 $manager = $this->pluginManager;
86 if (empty($plugins)) {
87 $plugins = $manager->getPluginsLoadedAndActivated();
88 } else {
89 $pluginMap = [];
90 foreach ($plugins as $plugin) {
91 if (is_string($plugin)) {
92 $plugin = $this->pluginManager->getLoadedPlugin($plugin);
93 }
94 $pluginMap[$plugin->getPluginName()] = $plugin;
95 }
96 $plugins = $pluginMap;
97 }
98 $callbacks = array();
99 // collect all callbacks to execute
100 foreach ($plugins as $pluginName => $plugin) {
101 if (!isset($this->pluginHooks[$pluginName])) {
102 $this->pluginHooks[$pluginName] = $plugin->registerEvents();
103 }
104 $hooks = $this->pluginHooks[$pluginName];
105 if (isset($hooks[$eventName])) {
106 list($pluginFunction, $callbackGroup) = $this->getCallbackFunctionAndGroupNumber($hooks[$eventName]);
107 if (is_string($pluginFunction)) {
108 $callbacks[$callbackGroup][] = [$plugin, $pluginFunction];
109 } else {
110 $callbacks[$callbackGroup][] = $pluginFunction;
111 }
112 }
113 }
114 if (isset($this->extraObservers[$eventName])) {
115 foreach ($this->extraObservers[$eventName] as $callbackInfo) {
116 list($callback, $callbackGroup) = $this->getCallbackFunctionAndGroupNumber($callbackInfo);
117 $callbacks[$callbackGroup][] = $callback;
118 }
119 }
120 // sort callbacks by their importance
121 ksort($callbacks);
122 // execute callbacks in order
123 foreach ($callbacks as $callbackGroup) {
124 foreach ($callbackGroup as $callback) {
125 call_user_func_array($callback, $params);
126 }
127 }
128 }
129 /**
130 * Associates a callback that is not a plugin class method with an event
131 * name.
132 *
133 * @param string $eventName
134 * @param array|callable $callback This can be a normal PHP callback or an array
135 * that looks like this:
136 * array(
137 * 'function' => $callback,
138 * 'before' => true
139 * )
140 * or this:
141 * array(
142 * 'function' => $callback,
143 * 'after' => true
144 * )
145 * If 'before' is set, the callback will be executed
146 * before normal & 'after' ones. If 'after' then it
147 * will be executed after normal ones.
148 */
149 public function addObserver($eventName, $callback)
150 {
151 $this->extraObservers[$eventName][] = $callback;
152 }
153 /**
154 * Re-posts all pending events to the given plugin.
155 *
156 * @param Plugin $plugin
157 */
158 public function postPendingEventsTo($plugin)
159 {
160 foreach ($this->pendingEvents as $eventInfo) {
161 [$eventName, $eventParams] = $eventInfo;
162 $this->postEvent($eventName, $eventParams, $pending = \false, array($plugin));
163 }
164 }
165 /**
166 * @internal For testing purpose only
167 */
168 public function clearCache()
169 {
170 $this->pluginHooks = [];
171 }
172 private function getCallbackFunctionAndGroupNumber($hookInfo)
173 {
174 if (is_array($hookInfo) && !empty($hookInfo['function'])) {
175 $pluginFunction = $hookInfo['function'];
176 if (!empty($hookInfo['before'])) {
177 $callbackGroup = self::EVENT_CALLBACK_GROUP_FIRST;
178 } elseif (!empty($hookInfo['after'])) {
179 $callbackGroup = self::EVENT_CALLBACK_GROUP_THIRD;
180 } else {
181 $callbackGroup = self::EVENT_CALLBACK_GROUP_SECOND;
182 }
183 } else {
184 $pluginFunction = $hookInfo;
185 $callbackGroup = self::EVENT_CALLBACK_GROUP_SECOND;
186 }
187 return array($pluginFunction, $callbackGroup);
188 }
189 }
190