Pass Router parameter to module content method

This commit is contained in:
Hypolite Petovan 2019-11-06 22:34:38 -05:00
parent f21edefe15
commit 134d6d18f9
6 changed files with 25 additions and 20 deletions

View File

@ -94,6 +94,14 @@ class Module
return $this->module_class;
}
/**
* @return array The module parameters extracted from the route
*/
public function getParameters()
{
return $this->module_parameters;
}
/**
* @return bool True, if the current module is a backend module
* @see Module::BACKEND_MODULES for a list

View File

@ -308,7 +308,7 @@ class Page implements ArrayAccess
$arr = ['content' => $content];
Hook::callAll($moduleClass . '_mod_content', $arr);
$content = $arr['content'];
$arr = ['content' => call_user_func([$moduleClass, 'content'], [])];
$arr = ['content' => call_user_func([$moduleClass, 'content'], $module->getParameters())];
Hook::callAll($moduleClass . '_mod_aftercontent', $arr);
$content .= $arr['content'];
} catch (HTTPException $e) {

View File

@ -65,12 +65,21 @@ class Router
*
* @throws HTTPException\InternalServerErrorException In case of invalid configs
*/
public function addRoutes(array $routes)
public function loadRoutes(array $routes)
{
$routeCollector = (isset($this->routeCollector) ?
$this->routeCollector :
new RouteCollector(new Std(), new GroupCountBased()));
$this->addRoutes($routeCollector, $routes);
$this->routeCollector = $routeCollector;
return $this;
}
private function addRoutes(RouteCollector $routeCollector, array $routes)
{
foreach ($routes as $route => $config) {
if ($this->isGroup($config)) {
$this->addGroup($route, $config, $routeCollector);
@ -80,10 +89,6 @@ class Router
throw new HTTPException\InternalServerErrorException("Wrong route config for route '" . print_r($route, true) . "'");
}
}
$this->routeCollector = $routeCollector;
return $this;
}
/**
@ -96,15 +101,7 @@ class Router
private function addGroup(string $groupRoute, array $routes, RouteCollector $routeCollector)
{
$routeCollector->addGroup($groupRoute, function (RouteCollector $routeCollector) use ($routes) {
foreach ($routes as $route => $config) {
if ($this->isGroup($config)) {
$this->addGroup($route, $config, $routeCollector);
} elseif ($this->isRoute($config)) {
$routeCollector->addRoute($config[1], $route, $config[0]);
}else {
throw new HTTPException\InternalServerErrorException("Wrong route config for route '" . print_r($route, true) . "'");
}
}
$this->addRoutes($routeCollector, $routes);
});
}
@ -174,7 +171,7 @@ class Router
$cmd = '/' . ltrim($cmd, '/');
$dispatcher = new \FastRoute\Dispatcher\GroupCountBased($this->routeCollector->getData());
$dispatcher = new Dispatcher\GroupCountBased($this->routeCollector->getData());
$moduleClass = null;
$this->parameters = [];

View File

@ -171,7 +171,7 @@ return [
$_SERVER, null
],
'call' => [
['addRoutes', [include __DIR__ . '/routes.config.php'], Dice::CHAIN_CALL],
['loadRoutes', [include __DIR__ . '/routes.config.php'], Dice::CHAIN_CALL],
],
],
L10n::class => [

View File

@ -152,7 +152,7 @@ class ModuleTest extends DatabaseTest
$config = \Mockery::mock(Configuration::class);
$config->shouldReceive('get')->with('config', 'private_addons', false)->andReturn($privAdd)->atMost()->once();
$router = (new App\Router([]))->addRoutes(include __DIR__ . '/../../../static/routes.config.php');
$router = (new App\Router([]))->loadRoutes(include __DIR__ . '/../../../static/routes.config.php');
$module = (new App\Module($name))->determineClass(new App\Arguments('', $command), $router, $config);

View File

@ -159,7 +159,7 @@ class RouterTest extends TestCase
{
$router = (new Router([
'REQUEST_METHOD' => Router::GET
]))->addRoutes($routes);
]))->loadRoutes($routes);
$this->assertEquals(Module\Home::class, $router->getModuleClass('/'));
$this->assertEquals(Module\Friendica::class, $router->getModuleClass('/group/route'));
@ -174,7 +174,7 @@ class RouterTest extends TestCase
{
$router = (new Router([
'REQUEST_METHOD' => Router::POST
]))->addRoutes($routes);
]))->loadRoutes($routes);
// Don't find GET
$this->assertEquals(Module\NodeInfo::class, $router->getModuleClass('/post/it'));