PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.1.6
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.1.6
5.13.0 5.12.1 5.12.0 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 2 years ago Access 2 years ago Application 2 years ago Archive 2 years ago ArchiveProcessor 2 years ago Archiver 2 years ago AssetManager 2 years ago Auth 2 years ago Category 2 years ago Changes 2 years ago CliMulti 2 years ago Columns 2 years ago Concurrency 2 years ago Config 2 years ago Container 2 years ago CronArchive 2 years ago DataAccess 2 years ago DataFiles 2 years ago DataTable 2 years ago Db 1 year ago DeviceDetector 2 years ago Email 2 years ago Exception 2 years ago Http 2 years ago Intl 2 years ago Log 2 years ago Mail 2 years ago Measurable 2 years ago Menu 2 years ago Metrics 2 years ago Notification 2 years ago Period 1 year ago Plugin 2 years ago ProfessionalServices 2 years ago Report 2 years ago ReportRenderer 2 years ago Scheduler 2 years ago Segment 2 years ago Session 2 years ago Settings 2 years ago Tracker 1 year ago Translation 2 years ago Twig 2 years ago UpdateCheck 2 years ago Updater 1 year ago Updates 1 year ago Validators 2 years ago View 2 years ago ViewDataTable 2 years ago Visualization 2 years ago Widget 2 years ago .htaccess 2 years ago Access.php 2 years ago Archive.php 2 years ago ArchiveProcessor.php 2 years ago AssetManager.php 2 years ago Auth.php 2 years ago AuthResult.php 2 years ago BaseFactory.php 2 years ago Cache.php 2 years ago CacheId.php 2 years ago CliMulti.php 2 years ago Common.php 2 years ago Config.php 2 years ago Console.php 2 years ago Context.php 2 years ago Cookie.php 2 years ago CronArchive.php 2 years ago DI.php 2 years ago DataArray.php 2 years ago DataTable.php 2 years ago Date.php 2 years ago Db.php 1 year ago DbHelper.php 1 year ago Development.php 2 years ago ErrorHandler.php 2 years ago EventDispatcher.php 2 years ago ExceptionHandler.php 2 years ago FileIntegrity.php 2 years ago Filechecks.php 2 years ago Filesystem.php 2 years ago FrontController.php 2 years ago Http.php 2 years ago IP.php 2 years ago Log.php 2 years ago LogDeleter.php 2 years ago Mail.php 2 years ago Metrics.php 2 years ago NoAccessException.php 2 years ago Nonce.php 2 years ago Notification.php 2 years ago NumberFormatter.php 2 years ago Option.php 2 years ago Period.php 2 years ago Piwik.php 2 years ago Plugin.php 2 years ago Profiler.php 2 years ago ProxyHeaders.php 2 years ago ProxyHttp.php 2 years ago QuickForm2.php 2 years ago RankingQuery.php 2 years ago ReportRenderer.php 2 years ago Request.php 2 years ago Segment.php 2 years ago Sequence.php 2 years ago Session.php 2 years ago SettingsPiwik.php 2 years ago SettingsServer.php 2 years ago Singleton.php 2 years ago Site.php 2 years ago SiteContentDetector.php 2 years ago SupportedBrowser.php 2 years ago TCPDF.php 2 years ago Theme.php 2 years ago Timer.php 2 years ago Tracker.php 2 years ago Twig.php 2 years ago Unzip.php 2 years ago UpdateCheck.php 2 years ago Updater.php 2 years ago UpdaterErrorException.php 2 years ago Updates.php 2 years ago Url.php 2 years ago UrlHelper.php 1 year ago Version.php 1 year ago View.php 2 years ago bootstrap.php 2 years ago dispatch.php 2 years ago testMinimumPhpVersion.php 2 years ago
EventDispatcher.php
189 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 /**
58 * Constructor.
59 */
60 public function __construct(\Piwik\Plugin\Manager $pluginManager, array $observers = array())
61 {
62 $this->pluginManager = $pluginManager;
63 foreach ($observers as $observerInfo) {
64 list($eventName, $callback) = $observerInfo;
65 $this->extraObservers[$eventName][] = $callback;
66 }
67 }
68 /**
69 * Triggers an event, executing all callbacks associated with it.
70 *
71 * @param string $eventName The name of the event, ie, API.getReportMetadata.
72 * @param array $params The parameters to pass to each callback when executing.
73 * @param bool $pending Whether this event should be posted again for plugins
74 * loaded after the event is fired.
75 * @param array|null $plugins The plugins to post events to. If null, the event
76 * is posted to all plugins. The elements of this array
77 * can be either the Plugin objects themselves
78 * or their string names.
79 */
80 public function postEvent($eventName, $params, $pending = false, $plugins = null)
81 {
82 if (self::$_SKIP_EVENTS_IN_TESTS) {
83 return;
84 }
85 if ($pending) {
86 $this->pendingEvents[] = array($eventName, $params);
87 }
88 $manager = $this->pluginManager;
89 if (empty($plugins)) {
90 $plugins = $manager->getPluginsLoadedAndActivated();
91 }
92 $callbacks = array();
93 // collect all callbacks to execute
94 foreach ($plugins as $pluginName) {
95 if (!is_string($pluginName)) {
96 $pluginName = $pluginName->getPluginName();
97 }
98 if (!isset($this->pluginHooks[$pluginName])) {
99 $plugin = $manager->getLoadedPlugin($pluginName);
100 $this->pluginHooks[$pluginName] = $plugin->registerEvents();
101 }
102 $hooks = $this->pluginHooks[$pluginName];
103 if (isset($hooks[$eventName])) {
104 list($pluginFunction, $callbackGroup) = $this->getCallbackFunctionAndGroupNumber($hooks[$eventName]);
105 if (is_string($pluginFunction)) {
106 $plugin = $manager->getLoadedPlugin($pluginName);
107 $callbacks[$callbackGroup][] = array($plugin, $pluginFunction);
108 } else {
109 $callbacks[$callbackGroup][] = $pluginFunction;
110 }
111 }
112 }
113 if (isset($this->extraObservers[$eventName])) {
114 foreach ($this->extraObservers[$eventName] as $callbackInfo) {
115 list($callback, $callbackGroup) = $this->getCallbackFunctionAndGroupNumber($callbackInfo);
116 $callbacks[$callbackGroup][] = $callback;
117 }
118 }
119 // sort callbacks by their importance
120 ksort($callbacks);
121 // execute callbacks in order
122 foreach ($callbacks as $callbackGroup) {
123 foreach ($callbackGroup as $callback) {
124 call_user_func_array($callback, $params);
125 }
126 }
127 }
128 /**
129 * Associates a callback that is not a plugin class method with an event
130 * name.
131 *
132 * @param string $eventName
133 * @param array|callable $callback This can be a normal PHP callback or an array
134 * that looks like this:
135 * array(
136 * 'function' => $callback,
137 * 'before' => true
138 * )
139 * or this:
140 * array(
141 * 'function' => $callback,
142 * 'after' => true
143 * )
144 * If 'before' is set, the callback will be executed
145 * before normal & 'after' ones. If 'after' then it
146 * will be executed after normal ones.
147 */
148 public function addObserver($eventName, $callback)
149 {
150 $this->extraObservers[$eventName][] = $callback;
151 }
152 /**
153 * Re-posts all pending events to the given plugin.
154 *
155 * @param Plugin $plugin
156 */
157 public function postPendingEventsTo($plugin)
158 {
159 foreach ($this->pendingEvents as $eventInfo) {
160 [$eventName, $eventParams] = $eventInfo;
161 $this->postEvent($eventName, $eventParams, $pending = false, array($plugin));
162 }
163 }
164 /**
165 * @internal For testing purpose only
166 */
167 public function clearCache()
168 {
169 $this->pluginHooks = [];
170 }
171 private function getCallbackFunctionAndGroupNumber($hookInfo)
172 {
173 if (is_array($hookInfo) && !empty($hookInfo['function'])) {
174 $pluginFunction = $hookInfo['function'];
175 if (!empty($hookInfo['before'])) {
176 $callbackGroup = self::EVENT_CALLBACK_GROUP_FIRST;
177 } elseif (!empty($hookInfo['after'])) {
178 $callbackGroup = self::EVENT_CALLBACK_GROUP_THIRD;
179 } else {
180 $callbackGroup = self::EVENT_CALLBACK_GROUP_SECOND;
181 }
182 } else {
183 $pluginFunction = $hookInfo;
184 $callbackGroup = self::EVENT_CALLBACK_GROUP_SECOND;
185 }
186 return array($pluginFunction, $callbackGroup);
187 }
188 }
189