aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/EventDispatcher/EventDispatcher.php
blob: b7554c439ea28d6e294c6510c0d210034b93be2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php

declare(strict_types=1);

/**
 * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
namespace OC\EventDispatcher;

use OC\Broadcast\Events\BroadcastEvent;
use OC\Log;
use OCP\Broadcast\Events\IBroadcastEvent;
use OCP\EventDispatcher\ABroadcastedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IServerContainer;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcher as SymfonyDispatcher;
use function get_class;

class EventDispatcher implements IEventDispatcher {
	public function __construct(
		private SymfonyDispatcher $dispatcher,
		private IServerContainer $container,
		private LoggerInterface $logger,
	) {
		// inject the event dispatcher into the logger
		// this is done here because there is a cyclic dependency between the event dispatcher and logger
		if ($this->logger instanceof Log || $this->logger instanceof Log\PsrLoggerAdapter) {
			$this->logger->setEventDispatcher($this);
		}
	}

	public function addListener(string $eventName,
		callable $listener,
		int $priority = 0): void {
		$this->dispatcher->addListener($eventName, $listener, $priority);
	}

	public function removeListener(string $eventName,
		callable $listener): void {
		$this->dispatcher->removeListener($eventName, $listener);
	}

	public function addServiceListener(string $eventName,
		string $className,
		int $priority = 0): void {
		$listener = new ServiceEventListener(
			$this->container,
			$className,
			$this->logger
		);

		$this->addListener($eventName, $listener, $priority);
	}

	public function hasListeners(string $eventName): bool {
		return $this->dispatcher->hasListeners($eventName);
	}

	/**
	 * @deprecated
	 */
	public function dispatch(string $eventName,
		Event $event): void {
		$this->dispatcher->dispatch($event, $eventName);

		if ($event instanceof ABroadcastedEvent && !$event->isPropagationStopped()) {
			// Propagate broadcast
			$this->dispatch(
				IBroadcastEvent::class,
				new BroadcastEvent($event)
			);
		}
	}

	public function dispatchTyped(Event $event): void {
		$this->dispatch(get_class($event), $event);
	}

	/**
	 * @return SymfonyDispatcher
	 * @deprecated 20.0.0
	 */
	public function getSymfonyDispatcher(): SymfonyDispatcher {
		return $this->dispatcher;
	}
}