]> git.mxchange.org Git - friendica.git/commitdiff
Add ArrayFilterEvent, replace app_menu hook
authorArt4 <art4@wlabs.de>
Tue, 28 Jan 2025 15:24:49 +0000 (15:24 +0000)
committerHypolite Petovan <hypolite@mrpetovan.com>
Tue, 4 Feb 2025 18:22:54 +0000 (13:22 -0500)
src/Content/Nav.php
src/Event/ArrayFilterEvent.php [new file with mode: 0644]
src/EventSubscriber/HookEventBridge.php
tests/Unit/Event/ArrayFilterEventTest.php [new file with mode: 0644]
tests/Unit/EventSubscriber/HookEventBridgeTest.php

index fdfcd4bde6aebf9cb583c6901fe4d608732d3261..e5da7d878a8f3347f49162cd8e7a21c551f8425d 100644 (file)
@@ -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 (file)
index 0000000..7e90633
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+// Copyright (C) 2010-2024, the Friendica project
+// SPDX-FileCopyrightText: 2010-2024 the Friendica project
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+declare(strict_types=1);
+
+namespace Friendica\Event;
+
+/**
+ * Allow Event listener to modify an array.
+ *
+ * @internal
+ */
+final class ArrayFilterEvent extends Event
+{
+       public const APP_MENU = 'friendica.data.app_menu';
+
+       private array $array;
+
+       public function __construct(string $name, array $array)
+       {
+               parent::__construct($name);
+
+               $this->array = $array;
+       }
+
+       public function getArray(): array
+       {
+               return $this->array;
+       }
+
+       public function setArray(array $array): void
+       {
+               $this->array = $array;
+       }
+}
index a90c3641032eeb81686e4bb1ac42df4deb74d3b9..662df204fd7fc7112ebad04c3e2e8b888c43c5c1 100644 (file)
@@ -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 (file)
index 0000000..c709e0f
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+// Copyright (C) 2010-2024, the Friendica project
+// SPDX-FileCopyrightText: 2010-2024 the Friendica project
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+declare(strict_types=1);
+
+namespace Friendica\Test\Unit\Event;
+
+use Friendica\Event\ArrayFilterEvent;
+use Friendica\Event\NamedEvent;
+use PHPUnit\Framework\TestCase;
+
+class ArrayFilterEventTest extends TestCase
+{
+       public function testImplementationOfInstances(): void
+       {
+               $event = new ArrayFilterEvent('test', []);
+
+               $this->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());
+       }
+}
index ea5460eca36ea3c19c0e1e876e401e24d48765ca..3b9b0afba1b4133f06185f0aa6f1a209c44d8bc6 100644 (file)
@@ -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 [