Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/App/Traits/WebAppTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Quantum\App\Exceptions\BaseException;
use Quantum\Di\Exceptions\DiException;
use Quantum\Module\ModuleLoader;
use Quantum\Router\RouteBuilder;
use DebugBar\DebugBarException;
use Quantum\Environment\Server;
use Quantum\Debugger\Debugger;
Expand Down Expand Up @@ -65,7 +66,6 @@ private function initializeDebugger()
/**
* Load modules
* @throws ModuleException
* @throws RouteException
*/
private function loadModules()
{
Expand All @@ -74,8 +74,10 @@ private function loadModules()
$modulesDependencies = $moduleLoader->loadModulesDependencies();
Di::registerDependencies($modulesDependencies);

$modulesRoutes = $moduleLoader->loadModulesRoutes();
Router::setRoutes($modulesRoutes);
$builder = new RouteBuilder();
$allRoutes = $builder->build($moduleLoader->loadModulesRoutes(), $moduleLoader->getModuleConfigs());

Router::setRoutes($allRoutes);
}

/**
Expand Down
8 changes: 6 additions & 2 deletions src/Console/Commands/OpenApiCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use Quantum\Libraries\Storage\FileSystem;
use Quantum\Di\Exceptions\DiException;
use Quantum\Module\ModuleLoader;
use Quantum\Router\RouteBuilder;
use Quantum\Console\QtCommand;
use Quantum\Router\Router;
use ReflectionException;
Expand Down Expand Up @@ -100,9 +101,12 @@ class OpenApiCommand extends QtCommand
*/
public function exec()
{
$modulesRoutes = ModuleLoader::getInstance()->loadModulesRoutes();
$moduleLoader = ModuleLoader::getInstance();

Router::setRoutes($modulesRoutes);
$builder = new RouteBuilder();
$allRoutes = $builder->build($moduleLoader->loadModulesRoutes(), $moduleLoader->getModuleConfigs());

Router::setRoutes($allRoutes);

$this->fs = FileSystemFactory::get();

Expand Down
10 changes: 7 additions & 3 deletions src/Console/Commands/RouteListCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@
use Quantum\Module\Exceptions\ModuleException;
use Quantum\Router\Exceptions\RouteException;
use Symfony\Component\Console\Helper\Table;
use Quantum\Router\RouteBuilder;
use Quantum\Module\ModuleLoader;
use Quantum\Console\QtCommand;
use Quantum\Router\Router;

/**
* Class ServeCommand
* Class RouteListCommand
* @package Quantum\Console
*/
class RouteListCommand extends QtCommand
Expand Down Expand Up @@ -53,9 +54,12 @@ class RouteListCommand extends QtCommand
public function exec()
{
try {
$modulesRoutes = ModuleLoader::getInstance()->loadModulesRoutes();
$moduleLoader = ModuleLoader::getInstance();

Router::setRoutes($modulesRoutes);
$builder = new RouteBuilder();
$allRoutes = $builder->build($moduleLoader->loadModulesRoutes(), $moduleLoader->getModuleConfigs());

Router::setRoutes($allRoutes);

$routes = Router::getRoutes();

Expand Down
88 changes: 36 additions & 52 deletions src/Module/ModuleLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
use Quantum\App\Exceptions\BaseException;
use Quantum\Libraries\Storage\FileSystem;
use Quantum\Di\Exceptions\DiException;
use Quantum\Router\Route;
use ReflectionException;
use Quantum\App\App;
use Closure;
Expand All @@ -42,10 +41,8 @@ class ModuleLoader
*/
private static $moduleConfigs = [];

/**
* @var array<Closure>
*/
private static $moduleRoutes = [];
/** @var array<string, Closure> */
private static $moduleRouteClosures = [];

/**
* @var FileSystem
Expand Down Expand Up @@ -80,12 +77,6 @@ public static function getInstance(): ModuleLoader
return self::$instance;
}

/**
* Load modules routes
* @return array
* @throws ModuleException
* @throws RouteException
*/
public function loadModulesRoutes(): array
{
if (empty(self::$moduleConfigs)) {
Expand All @@ -99,12 +90,33 @@ public function loadModulesRoutes(): array
continue;
}

$modulesRoutes = array_merge($modulesRoutes, $this->getModuleRoutes($module, new Route([$module => $options])));
$modulesRoutes[$module] = $this->getModuleRouteDefinitions($module);
}

return $modulesRoutes;
}

private function getModuleRouteDefinitions(string $module): Closure
{
if (isset(self::$moduleRouteClosures[$module])) {
return self::$moduleRouteClosures[$module];
}

$moduleRoutesPath = modules_dir() . DS . $module . DS . 'routes' . DS . 'routes.php';

if (!$this->fs->exists($moduleRoutesPath)) {
throw ModuleException::moduleRoutesNotFound($module);
}

$closure = $this->fs->require($moduleRoutesPath, true);

if (!$closure instanceof Closure) {
throw RouteException::notClosure();
}

return self::$moduleRouteClosures[$module] = $closure;
}

/**
* @return array
* @throws ModuleException
Expand Down Expand Up @@ -145,19 +157,6 @@ public function getModuleDependencies(string $module): array
return self::$moduleDependencies[$module];
}

/**
* @return array
* @throws ModuleException
*/
public function getModuleConfigs(): array
{
if (empty(self::$moduleConfigs)) {
$this->loadModuleConfig();
}

return self::$moduleConfigs;
}

/**
* @throws ModuleException
*/
Expand All @@ -173,39 +172,24 @@ private function loadModuleConfig()
}

/**
* @param array $options
* @return bool
*/
private function isModuleEnabled(array $options): bool
{
return $options['enabled'] ?? false;
}

/**
* @param string $module
* @param Route $route
* @return array
* @throws ModuleException
* @throws RouteException
*/
private function getModuleRoutes(string $module, Route $route): array
public function getModuleConfigs(): array
{
$moduleRoutes = modules_dir() . DS . $module . DS . 'routes' . DS . 'routes.php';

if (!$this->fs->exists($moduleRoutes)) {
throw ModuleException::moduleRoutesNotFound($module);
}

if (empty(self::$moduleRoutes[$module])) {
self::$moduleRoutes[$module] = $this->fs->require($moduleRoutes, true);
}

if (!self::$moduleRoutes[$module] instanceof Closure) {
throw RouteException::notClosure();
if (empty(self::$moduleConfigs)) {
$this->loadModuleConfig();
}

self::$moduleRoutes[$module]($route);
return self::$moduleConfigs;
}

return $route->getRuntimeRoutes();
/**
* @param array $options
* @return bool
*/
private function isModuleEnabled(array $options): bool
{
return (bool) ($options['enabled'] ?? false);
}
}
11 changes: 6 additions & 5 deletions src/Router/Route.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,14 @@ class Route
private $virtualRoutes = [];

/**
* @param array $module
* @param string $moduleName
* @param array $moduleOptions
*/
public function __construct(array $module)
public function __construct(string $moduleName, array $moduleOptions)
{
$this->virtualRoutes['*'] = [];
$this->moduleName = key($module);
$this->moduleOptions = $module[$this->moduleName];
$this->moduleName = $moduleName;
$this->moduleOptions = $moduleOptions;
}

/**
Expand All @@ -95,7 +96,7 @@ public function add(string $route, string $method, ...$params): Route
];

if (isset($this->moduleOptions['cacheable'])) {
$this->currentRoute['cache_settings']['shouldCache'] = (bool)$this->moduleOptions['cacheable'];
$this->currentRoute['cache_settings']['shouldCache'] = (bool) $this->moduleOptions['cacheable'];
}

if (is_callable($params[0])) {
Expand Down
48 changes: 48 additions & 0 deletions src/Router/RouteBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

/**
* Quantum PHP Framework
*
* An open source software development framework for PHP
*
* @package Quantum
* @author Arman Ag. <arman.ag@softberg.org>
* @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org)
* @link http://quantum.softberg.org/
* @since 3.0.0
*/

namespace Quantum\Router;

use Closure;

/**
* Class RouteBuilder
* @package Quantum\Router
*/
class RouteBuilder
{
/**
* @param array<string, Closure> $moduleClosures moduleName => closure(Route $collector): void
* @param array<string, array> $moduleConfigs moduleName => config options
* @return array
*/
public function build(array $moduleClosures, array $moduleConfigs = []): array
{
$allRoutes = [];

foreach ($moduleClosures as $module => $closure) {
$options = $moduleConfigs[$module] ?? [];

$routeCollector = new Route($module, $options);

$closure($routeCollector);

foreach ($routeCollector->getRuntimeRoutes() as $runtimeRoute) {
$allRoutes[] = $runtimeRoute;
}
}

return $allRoutes;
}
}
2 changes: 1 addition & 1 deletion src/Router/Router.php
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ private function handleRoutePattern(array $route): array
$routePattern = '(\/)?';
$routeParams = [];

$lastIndex = (int)array_key_last($routeSegments);
$lastIndex = (int) array_key_last($routeSegments);

foreach ($routeSegments as $index => $segment) {
$segmentParam = $this->getSegmentParam($segment, $index, $lastIndex);
Expand Down
10 changes: 5 additions & 5 deletions tests/Unit/Module/ModuleLoaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use Quantum\Tests\Unit\AppTestCase;
use Quantum\Module\ModuleLoader;
use Quantum\Router\Router;
use Closure;

class ModuleLoaderTest extends AppTestCase
{
Expand Down Expand Up @@ -32,13 +32,13 @@ public function testLoadModulesRoutes()
{
$modulesRoutes = $this->moduleLoader->loadModulesRoutes();

Router::setRoutes($modulesRoutes);
$this->assertNotEmpty($modulesRoutes);

$this->assertNotEmpty(Router::getRoutes());
$this->assertIsArray($modulesRoutes);

$this->assertIsArray(Router::getRoutes());
$this->assertArrayHasKey('Test', $modulesRoutes);

$this->assertCount(2, Router::getRoutes());
$this->assertInstanceOf(Closure::class, $modulesRoutes['Test']);
}

public function testLoadModulesDependencies()
Expand Down
Loading