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;
use Friendica\Module\Security\Login;
use Friendica\Network\HTTPException;
use Friendica\Security\OpenWebAuth;
+use Psr\EventDispatcher\EventDispatcherInterface;
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;
}
/**
) {
$arr = ['app_menu' => $appMenu];
- Hook::callAll('app_menu', $arr);
+ $arr = $this->eventDispatcher->dispatch(new ArrayFilterEvent(ArrayFilterEvent::APP_MENU, $arr))->getArray();
$appMenu = $arr['app_menu'];
}
--- /dev/null
+<?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;
+ }
+}
namespace Friendica\EventSubscriber;
use Friendica\Core\Hook;
+use Friendica\Event\ArrayFilterEvent;
use Friendica\Event\ConfigLoadedEvent;
use Friendica\Event\Event;
use Friendica\Event\HtmlFilterEvent;
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',
return [
Event::INIT => 'onNamedEvent',
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
+ ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent',
HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent',
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(
--- /dev/null
+<?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());
+ }
+}
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;
$expected = [
Event::INIT => 'onNamedEvent',
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
+ ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent',
HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent',
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 [