diff --git a/src/Content/Nav.php b/src/Content/Nav.php index fdfcd4bde6..e5da7d878a 100644 --- a/src/Content/Nav.php +++ b/src/Content/Nav.php @@ -15,6 +15,7 @@ use Friendica\Core\L10n; use Friendica\Core\Renderer; use Friendica\Core\Session\Capability\IHandleUserSessions; use Friendica\Database\Database; +use Friendica\Event\ArrayFilterEvent; use Friendica\Model\Contact; use Friendica\Model\User; use Friendica\Module\Conversation\Community; @@ -22,6 +23,7 @@ use Friendica\Module\Home; use Friendica\Module\Security\Login; use Friendica\Network\HTTPException; use Friendica\Security\OpenWebAuth; +use Psr\EventDispatcher\EventDispatcherInterface; class Nav { @@ -63,14 +65,17 @@ class Nav /** @var Router */ private $router; - public function __construct(BaseURL $baseUrl, L10n $l10n, IHandleUserSessions $session, Database $database, IManageConfigValues $config, Router $router) + private EventDispatcherInterface $eventDispatcher; + + public function __construct(BaseURL $baseUrl, L10n $l10n, IHandleUserSessions $session, Database $database, IManageConfigValues $config, Router $router, EventDispatcherInterface $eventDispatcher) { - $this->baseUrl = $baseUrl; - $this->l10n = $l10n; - $this->session = $session; - $this->database = $database; - $this->config = $config; - $this->router = $router; + $this->baseUrl = $baseUrl; + $this->l10n = $l10n; + $this->session = $session; + $this->database = $database; + $this->config = $config; + $this->router = $router; + $this->eventDispatcher = $eventDispatcher; } /** @@ -151,7 +156,7 @@ class Nav ) { $arr = ['app_menu' => $appMenu]; - Hook::callAll('app_menu', $arr); + $arr = $this->eventDispatcher->dispatch(new ArrayFilterEvent(ArrayFilterEvent::APP_MENU, $arr))->getArray(); $appMenu = $arr['app_menu']; } diff --git a/src/Event/ArrayFilterEvent.php b/src/Event/ArrayFilterEvent.php new file mode 100644 index 0000000000..7e9063398b --- /dev/null +++ b/src/Event/ArrayFilterEvent.php @@ -0,0 +1,39 @@ +array = $array; + } + + public function getArray(): array + { + return $this->array; + } + + public function setArray(array $array): void + { + $this->array = $array; + } +} diff --git a/src/EventSubscriber/HookEventBridge.php b/src/EventSubscriber/HookEventBridge.php index a90c364103..662df204fd 100644 --- a/src/EventSubscriber/HookEventBridge.php +++ b/src/EventSubscriber/HookEventBridge.php @@ -10,6 +10,7 @@ declare(strict_types=1); namespace Friendica\EventSubscriber; use Friendica\Core\Hook; +use Friendica\Event\ArrayFilterEvent; use Friendica\Event\ConfigLoadedEvent; use Friendica\Event\Event; use Friendica\Event\HtmlFilterEvent; @@ -35,6 +36,7 @@ final class HookEventBridge private static array $eventMapper = [ Event::INIT => 'init_1', ConfigLoadedEvent::CONFIG_LOADED => 'load_config', + ArrayFilterEvent::APP_MENU => 'app_menu', HtmlFilterEvent::HEAD => 'head', HtmlFilterEvent::FOOTER => 'footer', HtmlFilterEvent::PAGE_CONTENT_TOP => 'page_content_top', @@ -49,6 +51,7 @@ final class HookEventBridge return [ Event::INIT => 'onNamedEvent', ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent', + ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent', HtmlFilterEvent::HEAD => 'onHtmlFilterEvent', HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent', HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent', @@ -66,6 +69,13 @@ final class HookEventBridge static::callHook($event->getName(), $event->getConfig()); } + public static function onArrayFilterEvent(ArrayFilterEvent $event): void + { + $event->setArray( + static::callHook($event->getName(), $event->getArray()) + ); + } + public static function onHtmlFilterEvent(HtmlFilterEvent $event): void { $event->setHtml( diff --git a/tests/Unit/Event/ArrayFilterEventTest.php b/tests/Unit/Event/ArrayFilterEventTest.php new file mode 100644 index 0000000000..c709e0ff0a --- /dev/null +++ b/tests/Unit/Event/ArrayFilterEventTest.php @@ -0,0 +1,66 @@ +assertInstanceOf(NamedEvent::class, $event); + } + + public static function getPublicConstants(): array + { + return [ + [ArrayFilterEvent::APP_MENU, 'friendica.data.app_menu'], + ]; + } + + /** + * @dataProvider getPublicConstants + */ + public function testPublicConstantsAreAvailable($value, $expected): void + { + $this->assertSame($expected, $value); + } + + public function testGetNameReturnsName(): void + { + $event = new ArrayFilterEvent('test', []); + + $this->assertSame('test', $event->getName()); + } + + public function testGetArrayReturnsCorrectString(): void + { + $data = ['original']; + + $event = new ArrayFilterEvent('test', $data); + + $this->assertSame($data, $event->getArray()); + } + + public function testSetArrayUpdatesHtml(): void + { + $event = new ArrayFilterEvent('test', ['original']); + + $expected = ['updated']; + + $event->setArray($expected); + + $this->assertSame($expected, $event->getArray()); + } +} diff --git a/tests/Unit/EventSubscriber/HookEventBridgeTest.php b/tests/Unit/EventSubscriber/HookEventBridgeTest.php index ea5460eca3..3b9b0afba1 100644 --- a/tests/Unit/EventSubscriber/HookEventBridgeTest.php +++ b/tests/Unit/EventSubscriber/HookEventBridgeTest.php @@ -10,6 +10,7 @@ declare(strict_types=1); namespace Friendica\Test\Unit\EventSubscriber; use Friendica\Core\Config\Util\ConfigFileManager; +use Friendica\Event\ArrayFilterEvent; use Friendica\Event\ConfigLoadedEvent; use Friendica\Event\Event; use Friendica\Event\HtmlFilterEvent; @@ -23,6 +24,7 @@ class HookEventBridgeTest extends TestCase $expected = [ Event::INIT => 'onNamedEvent', ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent', + ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent', HtmlFilterEvent::HEAD => 'onHtmlFilterEvent', HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent', HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent', @@ -105,6 +107,34 @@ class HookEventBridgeTest extends TestCase HookEventBridge::onConfigLoadedEvent($event); } + public static function getArrayFilterEventData(): array + { + return [ + ['test', 'test'], + [ArrayFilterEvent::APP_MENU, 'app_menu'], + ]; + } + + /** + * @dataProvider getArrayFilterEventData + */ + public function testOnArrayFilterEventCallsHookWithCorrectValue($name, $expected): void + { + $event = new ArrayFilterEvent($name, ['original']); + + $reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook'); + $reflectionProperty->setAccessible(true); + + $reflectionProperty->setValue(null, function (string $name, $data) use ($expected) { + $this->assertSame($expected, $name); + $this->assertSame(['original'], $data); + + return $data; + }); + + HookEventBridge::onArrayFilterEvent($event); + } + public static function getHtmlFilterEventData(): array { return [