Implement route_collection hook as CollectRoutesEvent
This commit is contained in:
parent
7298ad29c1
commit
18369854b7
5 changed files with 162 additions and 6 deletions
|
@ -7,12 +7,10 @@
|
||||||
|
|
||||||
namespace Friendica\App;
|
namespace Friendica\App;
|
||||||
|
|
||||||
use Dice\Dice;
|
|
||||||
use FastRoute\DataGenerator\GroupCountBased;
|
use FastRoute\DataGenerator\GroupCountBased;
|
||||||
use FastRoute\Dispatcher;
|
use FastRoute\Dispatcher;
|
||||||
use FastRoute\RouteCollector;
|
use FastRoute\RouteCollector;
|
||||||
use FastRoute\RouteParser\Std;
|
use FastRoute\RouteParser\Std;
|
||||||
use Friendica\Capabilities\ICanHandleRequests;
|
|
||||||
use Friendica\Core\Addon;
|
use Friendica\Core\Addon;
|
||||||
use Friendica\Core\Cache\Enum\Duration;
|
use Friendica\Core\Cache\Enum\Duration;
|
||||||
use Friendica\Core\Cache\Capability\ICanCache;
|
use Friendica\Core\Cache\Capability\ICanCache;
|
||||||
|
@ -21,6 +19,7 @@ use Friendica\Core\Hook;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Core\Lock\Capability\ICanLock;
|
use Friendica\Core\Lock\Capability\ICanLock;
|
||||||
use Friendica\Core\Session\Capability\IHandleUserSessions;
|
use Friendica\Core\Session\Capability\IHandleUserSessions;
|
||||||
|
use Friendica\Event\CollectRoutesEvent;
|
||||||
use Friendica\LegacyModule;
|
use Friendica\LegacyModule;
|
||||||
use Friendica\Module\HTTPException\MethodNotAllowed;
|
use Friendica\Module\HTTPException\MethodNotAllowed;
|
||||||
use Friendica\Module\HTTPException\PageNotFound;
|
use Friendica\Module\HTTPException\PageNotFound;
|
||||||
|
@ -30,6 +29,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||||
use Friendica\Network\HTTPException\MethodNotAllowedException;
|
use Friendica\Network\HTTPException\MethodNotAllowedException;
|
||||||
use Friendica\Network\HTTPException\NotFoundException;
|
use Friendica\Network\HTTPException\NotFoundException;
|
||||||
use Friendica\Util\Router\FriendicaGroupCountBased;
|
use Friendica\Util\Router\FriendicaGroupCountBased;
|
||||||
|
use Psr\EventDispatcher\EventDispatcherInterface;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,6 +86,8 @@ class Router
|
||||||
/** @var LoggerInterface */
|
/** @var LoggerInterface */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
|
private EventDispatcherInterface $eventDispatcher;
|
||||||
|
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
private $isLocalUser;
|
private $isLocalUser;
|
||||||
|
|
||||||
|
@ -110,7 +112,7 @@ class Router
|
||||||
* @param IHandleUserSessions $userSession
|
* @param IHandleUserSessions $userSession
|
||||||
* @param RouteCollector|null $routeCollector
|
* @param RouteCollector|null $routeCollector
|
||||||
*/
|
*/
|
||||||
public function __construct(array $server, string $baseRoutesFilepath, L10n $l10n, ICanCache $cache, ICanLock $lock, IManageConfigValues $config, Arguments $args, LoggerInterface $logger, IHandleUserSessions $userSession, RouteCollector $routeCollector = null)
|
public function __construct(array $server, string $baseRoutesFilepath, L10n $l10n, ICanCache $cache, ICanLock $lock, IManageConfigValues $config, Arguments $args, LoggerInterface $logger, EventDispatcherInterface $eventDispatcher, IHandleUserSessions $userSession, RouteCollector $routeCollector = null)
|
||||||
{
|
{
|
||||||
$this->baseRoutesFilepath = $baseRoutesFilepath;
|
$this->baseRoutesFilepath = $baseRoutesFilepath;
|
||||||
$this->l10n = $l10n;
|
$this->l10n = $l10n;
|
||||||
|
@ -120,6 +122,7 @@ class Router
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->server = $server;
|
$this->server = $server;
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
|
$this->eventDispatcher = $eventDispatcher;
|
||||||
$this->isLocalUser = !empty($userSession->getLocalUserId());
|
$this->isLocalUser = !empty($userSession->getLocalUserId());
|
||||||
|
|
||||||
$this->routeCollector = $routeCollector ?? new RouteCollector(new Std(), new GroupCountBased());
|
$this->routeCollector = $routeCollector ?? new RouteCollector(new Std(), new GroupCountBased());
|
||||||
|
@ -147,10 +150,12 @@ class Router
|
||||||
|
|
||||||
$this->addRoutes($routeCollector, $routes);
|
$this->addRoutes($routeCollector, $routes);
|
||||||
|
|
||||||
$this->routeCollector = $routeCollector;
|
|
||||||
|
|
||||||
// Add routes from addons
|
// Add routes from addons
|
||||||
Hook::callAll('route_collection', $this->routeCollector);
|
$routeCollector = $this->eventDispatcher->dispatch(
|
||||||
|
new CollectRoutesEvent(CollectRoutesEvent::COLLECT_ROUTES, $routeCollector),
|
||||||
|
)->getRouteCollector();
|
||||||
|
|
||||||
|
$this->routeCollector = $routeCollector;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ namespace Friendica\Core\Hooks;
|
||||||
|
|
||||||
use Friendica\Core\Hook;
|
use Friendica\Core\Hook;
|
||||||
use Friendica\Event\ArrayFilterEvent;
|
use Friendica\Event\ArrayFilterEvent;
|
||||||
|
use Friendica\Event\CollectRoutesEvent;
|
||||||
use Friendica\Event\ConfigLoadedEvent;
|
use Friendica\Event\ConfigLoadedEvent;
|
||||||
use Friendica\Event\Event;
|
use Friendica\Event\Event;
|
||||||
use Friendica\Event\HtmlFilterEvent;
|
use Friendica\Event\HtmlFilterEvent;
|
||||||
|
@ -37,6 +38,7 @@ final class HookEventBridge
|
||||||
Event::INIT => 'init_1',
|
Event::INIT => 'init_1',
|
||||||
Event::HOME_INIT => 'home_init',
|
Event::HOME_INIT => 'home_init',
|
||||||
ConfigLoadedEvent::CONFIG_LOADED => 'load_config',
|
ConfigLoadedEvent::CONFIG_LOADED => 'load_config',
|
||||||
|
CollectRoutesEvent::COLLECT_ROUTES => 'route_collection',
|
||||||
ArrayFilterEvent::APP_MENU => 'app_menu',
|
ArrayFilterEvent::APP_MENU => 'app_menu',
|
||||||
ArrayFilterEvent::NAV_INFO => 'nav_info',
|
ArrayFilterEvent::NAV_INFO => 'nav_info',
|
||||||
ArrayFilterEvent::FEATURE_ENABLED => 'isEnabled',
|
ArrayFilterEvent::FEATURE_ENABLED => 'isEnabled',
|
||||||
|
@ -61,6 +63,7 @@ final class HookEventBridge
|
||||||
Event::INIT => 'onNamedEvent',
|
Event::INIT => 'onNamedEvent',
|
||||||
Event::HOME_INIT => 'onNamedEvent',
|
Event::HOME_INIT => 'onNamedEvent',
|
||||||
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
||||||
|
CollectRoutesEvent::COLLECT_ROUTES => 'onCollectRoutesEvent',
|
||||||
ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
|
ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
|
||||||
ArrayFilterEvent::NAV_INFO => 'onArrayFilterEvent',
|
ArrayFilterEvent::NAV_INFO => 'onArrayFilterEvent',
|
||||||
ArrayFilterEvent::FEATURE_ENABLED => 'onArrayFilterEvent',
|
ArrayFilterEvent::FEATURE_ENABLED => 'onArrayFilterEvent',
|
||||||
|
@ -87,6 +90,13 @@ final class HookEventBridge
|
||||||
static::callHook($event->getName(), $event->getConfig());
|
static::callHook($event->getName(), $event->getConfig());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function onCollectRoutesEvent(CollectRoutesEvent $event): void
|
||||||
|
{
|
||||||
|
$event->setRouteCollector(
|
||||||
|
static::callHook($event->getName(), $event->getRouteCollector())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public static function onArrayFilterEvent(ArrayFilterEvent $event): void
|
public static function onArrayFilterEvent(ArrayFilterEvent $event): void
|
||||||
{
|
{
|
||||||
$event->setArray(
|
$event->setArray(
|
||||||
|
|
41
src/Event/CollectRoutesEvent.php
Normal file
41
src/Event/CollectRoutesEvent.php
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?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;
|
||||||
|
|
||||||
|
use FastRoute\RouteCollector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow addons to collect routes.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class CollectRoutesEvent extends Event
|
||||||
|
{
|
||||||
|
public const COLLECT_ROUTES = 'friendica.collect_routes';
|
||||||
|
|
||||||
|
private RouteCollector $routeCollector;
|
||||||
|
|
||||||
|
public function __construct(string $name, RouteCollector $routeCollector)
|
||||||
|
{
|
||||||
|
parent::__construct($name);
|
||||||
|
|
||||||
|
$this->routeCollector = $routeCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRouteCollector(): RouteCollector
|
||||||
|
{
|
||||||
|
return $this->routeCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setRouteCollector(RouteCollector $routeCollector): void
|
||||||
|
{
|
||||||
|
$this->routeCollector = $routeCollector;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,9 +9,11 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Friendica\Test\Unit\Core\Hooks;
|
namespace Friendica\Test\Unit\Core\Hooks;
|
||||||
|
|
||||||
|
use FastRoute\RouteCollector;
|
||||||
use Friendica\Core\Config\Util\ConfigFileManager;
|
use Friendica\Core\Config\Util\ConfigFileManager;
|
||||||
use Friendica\Core\Hooks\HookEventBridge;
|
use Friendica\Core\Hooks\HookEventBridge;
|
||||||
use Friendica\Event\ArrayFilterEvent;
|
use Friendica\Event\ArrayFilterEvent;
|
||||||
|
use Friendica\Event\CollectRoutesEvent;
|
||||||
use Friendica\Event\ConfigLoadedEvent;
|
use Friendica\Event\ConfigLoadedEvent;
|
||||||
use Friendica\Event\Event;
|
use Friendica\Event\Event;
|
||||||
use Friendica\Event\HtmlFilterEvent;
|
use Friendica\Event\HtmlFilterEvent;
|
||||||
|
@ -25,6 +27,7 @@ class HookEventBridgeTest extends TestCase
|
||||||
Event::INIT => 'onNamedEvent',
|
Event::INIT => 'onNamedEvent',
|
||||||
Event::HOME_INIT => 'onNamedEvent',
|
Event::HOME_INIT => 'onNamedEvent',
|
||||||
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
||||||
|
CollectRoutesEvent::COLLECT_ROUTES => 'onCollectRoutesEvent',
|
||||||
ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
|
ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
|
||||||
ArrayFilterEvent::NAV_INFO => 'onArrayFilterEvent',
|
ArrayFilterEvent::NAV_INFO => 'onArrayFilterEvent',
|
||||||
ArrayFilterEvent::FEATURE_ENABLED => 'onArrayFilterEvent',
|
ArrayFilterEvent::FEATURE_ENABLED => 'onArrayFilterEvent',
|
||||||
|
@ -117,6 +120,36 @@ class HookEventBridgeTest extends TestCase
|
||||||
HookEventBridge::onConfigLoadedEvent($event);
|
HookEventBridge::onConfigLoadedEvent($event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getCollectRoutesEventData(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['test', 'test'],
|
||||||
|
[CollectRoutesEvent::COLLECT_ROUTES, 'route_collection'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getCollectRoutesEventData
|
||||||
|
*/
|
||||||
|
public function testOnCollectRoutesEventCallsHookWithCorrectValue($name, $expected): void
|
||||||
|
{
|
||||||
|
$routeCollector = $this->createStub(RouteCollector::class);
|
||||||
|
|
||||||
|
$event = new CollectRoutesEvent($name, $routeCollector);
|
||||||
|
|
||||||
|
$reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook');
|
||||||
|
$reflectionProperty->setAccessible(true);
|
||||||
|
|
||||||
|
$reflectionProperty->setValue(null, function (string $name, $data) use ($expected, $routeCollector) {
|
||||||
|
$this->assertSame($expected, $name);
|
||||||
|
$this->assertSame($routeCollector, $data);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
});
|
||||||
|
|
||||||
|
HookEventBridge::onCollectRoutesEvent($event);
|
||||||
|
}
|
||||||
|
|
||||||
public static function getArrayFilterEventData(): array
|
public static function getArrayFilterEventData(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|
67
tests/Unit/Event/CollectRoutesEventTest.php
Normal file
67
tests/Unit/Event/CollectRoutesEventTest.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?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 FastRoute\RouteCollector;
|
||||||
|
use Friendica\Event\CollectRoutesEvent;
|
||||||
|
use Friendica\Event\NamedEvent;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class CollectRoutesEventTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testImplementationOfInstances(): void
|
||||||
|
{
|
||||||
|
$event = new CollectRoutesEvent('test', $this->createStub(RouteCollector::class));
|
||||||
|
|
||||||
|
$this->assertInstanceOf(NamedEvent::class, $event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getPublicConstants(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[CollectRoutesEvent::COLLECT_ROUTES, 'friendica.collect_routes'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getPublicConstants
|
||||||
|
*/
|
||||||
|
public function testPublicConstantsAreAvailable($value, $expected): void
|
||||||
|
{
|
||||||
|
$this->assertSame($expected, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetNameReturnsName(): void
|
||||||
|
{
|
||||||
|
$event = new CollectRoutesEvent('test', $this->createStub(RouteCollector::class));
|
||||||
|
|
||||||
|
$this->assertSame('test', $event->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetRouteCollectorReturnsCorrectString(): void
|
||||||
|
{
|
||||||
|
$routeCollector = $this->createStub(RouteCollector::class);
|
||||||
|
|
||||||
|
$event = new CollectRoutesEvent('test', $routeCollector);
|
||||||
|
|
||||||
|
$this->assertSame($routeCollector, $event->getRouteCollector());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetRouteCollector(): void
|
||||||
|
{
|
||||||
|
$event = new CollectRoutesEvent('test', $this->createStub(RouteCollector::class));
|
||||||
|
|
||||||
|
$routeCollector = $this->createStub(RouteCollector::class);
|
||||||
|
|
||||||
|
$event->setRouteCollector($routeCollector);
|
||||||
|
|
||||||
|
$this->assertSame($routeCollector, $event->getRouteCollector());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue