From df3acb6605d1374d9c90fe67d9cc095194129c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Sun, 20 Nov 2016 18:05:57 +0100 Subject: [PATCH] Enchacements - Added more doctype and descriptions on functionality. - Renamed methods and properties to make better sense. - Added IRoute interface for easier extendability. --- src/Pecee/SimpleRouter/IRoute.php | 64 +++++++++++++++++ src/Pecee/SimpleRouter/LoadableRoute.php | 4 +- src/Pecee/SimpleRouter/RouterBase.php | 87 +++++++++++------------- src/Pecee/SimpleRouter/RouterEntry.php | 12 ++-- src/Pecee/SimpleRouter/RouterGroup.php | 4 +- src/Pecee/SimpleRouter/SimpleRouter.php | 39 +++++++---- 6 files changed, 140 insertions(+), 70 deletions(-) create mode 100644 src/Pecee/SimpleRouter/IRoute.php diff --git a/src/Pecee/SimpleRouter/IRoute.php b/src/Pecee/SimpleRouter/IRoute.php new file mode 100644 index 0000000..2c10a8d --- /dev/null +++ b/src/Pecee/SimpleRouter/IRoute.php @@ -0,0 +1,64 @@ +setNames((array)$values['as']); @@ -143,7 +143,7 @@ abstract class LoadableRoute extends RouterEntry implements ILoadableRoute $this->setUrl($values['prefix'] . $this->getUrl()); } - parent::merge($values); + parent::setSettings($values); return $this; } diff --git a/src/Pecee/SimpleRouter/RouterBase.php b/src/Pecee/SimpleRouter/RouterBase.php index d063da9..46dc402 100644 --- a/src/Pecee/SimpleRouter/RouterBase.php +++ b/src/Pecee/SimpleRouter/RouterBase.php @@ -4,7 +4,6 @@ namespace Pecee\SimpleRouter; use Pecee\Handlers\IExceptionHandler; use Pecee\Http\Middleware\BaseCsrfVerifier; use Pecee\Http\Request; -use Pecee\Http\Response; use Pecee\SimpleRouter\Exceptions\HttpException; use Pecee\SimpleRouter\Exceptions\NotFoundHttpException; @@ -12,6 +11,7 @@ class RouterBase { /** + * The instance of this class * @var static */ protected static $instance; @@ -23,14 +23,7 @@ class RouterBase protected $request; /** - * Response - * @var Response - */ - protected $response; - - /** - * Used to keep track of whether or not a should should be added to - * the backstack-list for group-processing or not. + * Defines if a route is currently being processed. * @var bool */ protected $processingRoute; @@ -42,16 +35,17 @@ class RouterBase protected $routes; /** - * List of + * List of processed routes * @var array */ - protected $controllerUrlMap; + protected $processedRoutes; /** - * Backstack array used to keep track of sub-routes + * Stack of routes used to keep track of sub-routes added + * when a route is being processed. * @var array */ - protected $backStack; + protected $routeStack; /** * List of added bootmanagers @@ -111,23 +105,27 @@ class RouterBase { $this->processingRoute = false; $this->request = new Request(); - $this->response = new Response($this->request); $this->routes = []; $this->bootManagers = []; - $this->backStack = []; - $this->controllerUrlMap = []; + $this->routeStack = []; + $this->processedRoutes = []; $this->exceptionHandlers = []; } /** * Add route - * @param RouterEntry $route - * @return RouterEntry + * @param IRoute $route + * @return IRoute */ - public function addRoute(RouterEntry $route) + public function addRoute(IRoute $route) { - if ($this->processingRoute) { - $this->backStack[] = $route; + /* + * If a route is currently being processed, that means that the + * route being added are rendered from the parent routes callback, + * so we add them to the stack instead. + */ + if ($this->processingRoute === true) { + $this->routeStack[] = $route; } else { $this->routes[] = $route; } @@ -135,10 +133,10 @@ class RouterBase return $route; } - protected function processRoutes(array $routes, RouterGroup $group = null, RouterEntry $parent = null) + protected function processRoutes(array $routes, RouterGroup $group = null, IRoute $parent = null) { // Loop through each route-request - /* @var $route RouterEntry */ + /* @var $route IRoute */ foreach ($routes as $route) { if ($route instanceof RouterGroup) { @@ -175,24 +173,24 @@ class RouterBase $route->setParent($parent); /* Add/merge parent settings with child */ - $route->merge($parent->toArray()); + $route->setSettings($parent->toArray()); } if ($route instanceof ILoadableRoute) { /* Add the route to the map, so we can find the active one when all routes has been loaded */ - $this->controllerUrlMap[] = $route; + $this->processedRoutes[] = $route; } - if (count($this->backStack) > 0) { + if (count($this->routeStack) > 0) { /* Pop and grap the routes added when executing group callback earlier */ - $backStack = $this->backStack; - $this->backStack = []; + $stack = $this->routeStack; + $this->routeStack = []; - /* Route any routes added to the backstack */ - $this->processRoutes($backStack, $route, $group); + /* Route any routes added to the stack */ + $this->processRoutes($stack, $route, $group); } } } @@ -204,7 +202,7 @@ class RouterBase try { - // Initialize boot-managers + /* Initialize boot-managers */ if (count($this->bootManagers) > 0) { /* @var $manager RouterBootManager */ foreach ($this->bootManagers as $manager) { @@ -218,7 +216,7 @@ class RouterBase if ($rewrite === false) { - // Loop through each route-request + /* Loop through each route-request */ $this->processRoutes($this->routes); if ($this->csrfVerifier !== null) { @@ -230,11 +228,13 @@ class RouterBase $this->originalUrl = $this->request->getUri(); } - /* @var $route RouterEntry */ - foreach ($this->controllerUrlMap as $route) { + /* @var $route IRoute */ + foreach ($this->processedRoutes as $route) { + /* If the route matches */ if ($route->matchRoute($this->request)) { + /* Check if request method matches */ if (count($route->getRequestMethods()) > 0 && !in_array($this->request->getMethod(), $route->getRequestMethods())) { $routeNotAllowed = true; continue; @@ -243,6 +243,7 @@ class RouterBase $this->loadedRoute = $route; $this->loadedRoute->loadMiddleware($this->request, $this->loadedRoute); + /* If the request has changed, we reinitialize the router */ if ($this->request->getUri() !== $this->originalUrl && !in_array($this->request->getUri(), $this->routeRewrites)) { $this->routeRewrites[] = $this->request->getUri(); $this->routeRequest(true); @@ -250,6 +251,7 @@ class RouterBase return; } + /* Render route */ $routeNotAllowed = false; $this->request->setUri($this->originalUrl); $this->loadedRoute->renderRoute($this->request); @@ -284,7 +286,9 @@ class RouterBase $request = $handler->handleError($this->request, $this->loadedRoute, $e); - if ($request !== null && $request->getUri() !== $this->originalUrl && !in_array($request->getUri(), $this->routeRewrites)) { + /* If the request has changed */ + if ($request !== null && $this->request->getUri() !== $this->originalUrl && !in_array($request->getUri(), $this->routeRewrites)) { + $this->request = $request; $this->routeRewrites[] = $request->getUri(); $this->routeRequest(true); @@ -370,7 +374,7 @@ class RouterBase public function findRoute($name) { /* @var $route LoadableRoute */ - foreach ($this->controllerUrlMap as $route) { + foreach ($this->processedRoutes as $route) { /* Check if the name matches with a name on the route. Should match either router alias or controller alias. */ if ($route->hasName($name)) { @@ -465,7 +469,7 @@ class RouterBase /* Loop through all the routes to see if we can find a match */ /* @var $route LoadableRoute */ - foreach ($this->controllerUrlMap as $route) { + foreach ($this->processedRoutes as $route) { /* Check if the route contains the name/alias */ if ($route->hasName($controller)) { @@ -530,15 +534,6 @@ class RouterBase return $this->request; } - /** - * Get response - * @return Response - */ - public function getResponse() - { - return $this->response; - } - /** * Get csrf verifier class * @return BaseCsrfVerifier diff --git a/src/Pecee/SimpleRouter/RouterEntry.php b/src/Pecee/SimpleRouter/RouterEntry.php index b181754..f61022a 100644 --- a/src/Pecee/SimpleRouter/RouterEntry.php +++ b/src/Pecee/SimpleRouter/RouterEntry.php @@ -6,7 +6,7 @@ use Pecee\Http\Request; use Pecee\SimpleRouter\Exceptions\HttpException; use Pecee\SimpleRouter\Exceptions\NotFoundHttpException; -abstract class RouterEntry +abstract class RouterEntry implements IRoute { const REQUEST_TYPE_GET = 'get'; const REQUEST_TYPE_POST = 'post'; @@ -125,7 +125,7 @@ abstract class RouterEntry return null; } - public function loadMiddleware(Request $request, RouterEntry &$route) + public function loadMiddleware(Request $request, LoadableRoute &$route) { if (count($this->getMiddlewares()) > 0) { foreach ($this->getMiddlewares() as $middleware) { @@ -241,10 +241,10 @@ abstract class RouterEntry /** * Set parent route * - * @param RouterEntry $parent + * @param IRoute $parent * @return static $this */ - public function setParent(RouterEntry $parent) + public function setParent(IRoute $parent) { $this->parent = $parent; @@ -450,7 +450,7 @@ abstract class RouterEntry * @param array $values * @return static $this */ - public function merge(array $values) + public function setSettings(array $values) { if (isset($values['namespace']) && $this->namespace === null) { $this->setNamespace($values['namespace']); @@ -476,6 +476,4 @@ abstract class RouterEntry return $this; } - abstract function matchRoute(Request $request); - } \ No newline at end of file diff --git a/src/Pecee/SimpleRouter/RouterGroup.php b/src/Pecee/SimpleRouter/RouterGroup.php index 18d7ffb..1ede4f4 100644 --- a/src/Pecee/SimpleRouter/RouterGroup.php +++ b/src/Pecee/SimpleRouter/RouterGroup.php @@ -88,7 +88,7 @@ class RouterGroup extends RouterEntry * @param array $values * @return static */ - public function merge(array $values) + public function setSettings(array $values) { if (isset($values['prefix'])) { $this->setPrefix($values['prefix'] . $this->prefix); @@ -102,7 +102,7 @@ class RouterGroup extends RouterEntry $this->setDomains((array)$values['domain']); } - parent::merge($values); + parent::setSettings($values); return $this; } diff --git a/src/Pecee/SimpleRouter/SimpleRouter.php b/src/Pecee/SimpleRouter/SimpleRouter.php index 553b050..d36b6ce 100644 --- a/src/Pecee/SimpleRouter/SimpleRouter.php +++ b/src/Pecee/SimpleRouter/SimpleRouter.php @@ -8,13 +8,24 @@ namespace Pecee\SimpleRouter; use Pecee\Http\Middleware\BaseCsrfVerifier; +use Pecee\Http\Response; use Pecee\SimpleRouter\Exceptions\HttpException; use Pecee\SimpleRouter\Exceptions\NotFoundHttpException; class SimpleRouter { + /** + * Default namespace added to all routes + * @var string + */ protected static $defaultNamespace; + /** + * The response object + * @var Response + */ + protected static $response; + /** * Start/route request * @@ -147,7 +158,7 @@ class SimpleRouter { $group = new RouterGroup(); $group->setCallback($callback); - $group->merge($settings); + $group->setSettings($settings); if (is_callable($callback) === false) { throw new \InvalidArgumentException('Invalid callback provided. Only functions or methods supported'); @@ -194,7 +205,7 @@ class SimpleRouter * @param string $url * @param string|\Closure $callback * @param array|null $settings - * @return RouterEntry|RouterRoute + * @return RouterRoute */ public static function match(array $requestMethods, $url, $callback, array $settings = null) { @@ -203,7 +214,7 @@ class SimpleRouter $route = static::addDefaultNamespace($route); if ($settings !== null) { - $route->merge($settings); + $route->setSettings($settings); } static::router()->addRoute($route); @@ -222,11 +233,10 @@ class SimpleRouter public static function all($url, $callback, array $settings = null) { $route = new RouterRoute($url, $callback); - $route = static::addDefaultNamespace($route); if ($settings !== null) { - $route->merge($settings); + $route->setSettings($settings); } static::router()->addRoute($route); @@ -245,11 +255,10 @@ class SimpleRouter public static function controller($url, $controller, array $settings = null) { $route = new RouterController($url, $controller); - $route = static::addDefaultNamespace($route); if ($settings !== null) { - $route->merge($settings); + $route->setSettings($settings); } static::router()->addRoute($route); @@ -270,7 +279,7 @@ class SimpleRouter $route = new RouterResource($url, $controller); if ($settings !== null) { - $route->merge($settings); + $route->setSettings($settings); } static::router()->addRoute($route); @@ -338,11 +347,15 @@ class SimpleRouter /** * Get the response object * - * @return \Pecee\Http\Response + * @return Response */ public static function response() { - return static::router()->getResponse(); + if(static::$response === null) { + static::$response = new Response(static::request()); + } + + return static::$response; } /** @@ -358,10 +371,10 @@ class SimpleRouter /** * Prepends the default namespace to all new routes added. * - * @param RouterEntry $route - * @return RouterEntry + * @param IRoute $route + * @return IRoute */ - protected static function addDefaultNamespace(RouterEntry $route) + protected static function addDefaultNamespace(IRoute $route) { if (static::$defaultNamespace !== null) { $namespace = static::$defaultNamespace;