Added parameter support for Group routes.

This commit is contained in:
Simon Sessingø
2017-09-03 16:37:20 +01:00
parent 52e0f5ef94
commit 3a90578351
5 changed files with 74 additions and 34 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ interface IRoute
*
* @param Request $request
* @throws \Pecee\SimpleRouter\Exceptions\NotFoundHttpException
* @return void
* @return string
*/
public function renderRoute(Request $request);
+2 -1
View File
@@ -42,6 +42,7 @@ abstract class Route implements IRoute
protected $defaultParameterRegex;
protected $paramModifiers = '{}';
protected $paramOptionalSymbol = '?';
protected $urlRegex = '/^%s\/?$/u';
protected $group;
protected $parent;
protected $callback;
@@ -154,7 +155,7 @@ abstract class Route implements IRoute
$urlRegex = preg_quote($route, '/');
}
if (preg_match('/^' . $urlRegex . '\/?$/u', $url, $matches) > 0) {
if (preg_match(sprintf($this->urlRegex, $urlRegex), $url, $matches) > 0) {
$values = [];
+13 -5
View File
@@ -48,9 +48,17 @@ class RouteGroup extends Route implements IGroupRoute
*/
public function matchRoute($url, Request $request)
{
/* Skip if prefix doesn't match */
if ($this->prefix !== null && stripos($url, $this->prefix) === false) {
return false;
if($this->prefix !== null) {
/* Parse parameters from current route */
$parameters = $this->parseParameters($this->prefix, $url);
/* If no custom regular expression or parameters was found on this route, we stop */
if ($parameters === null) {
return false;
}
/* Set the parameters */
$this->setParameters((array)$parameters);
}
return $this->matchDomain($request);
@@ -150,11 +158,11 @@ class RouteGroup extends Route implements IGroupRoute
$this->setPrefix($values['prefix'] . $this->prefix);
}
if (isset($values['exceptionHandler'])) {
if ($merge === false && isset($values['exceptionHandler'])) {
$this->setExceptionHandlers((array)$values['exceptionHandler']);
}
if (isset($values['domain'])) {
if ($merge === false &&isset($values['domain'])) {
$this->setDomains((array)$values['domain']);
}
@@ -0,0 +1,34 @@
<?php
namespace Pecee\SimpleRouter\Route;
use Pecee\Http\Request;
class PartialGroup extends RouteGroup
{
/**
* Method called to check if route matches
*
* @param string $url
* @param Request $request
* @return bool
*/
public function matchRoute($url, Request $request)
{
if($this->prefix !== null) {
/* Parse parameters from current route */
$parameters = $this->parseParameters($this->prefix, $url);
/* If no custom regular expression or parameters was found on this route, we stop */
if ($parameters === null) {
return false;
}
/* Set the parameters */
$this->setParameters((array)$parameters);
}
return $this->matchDomain($request);
}
}
+24 -27
View File
@@ -129,15 +129,27 @@ class Router
$route = $routes[$i];
if ($parent !== null) {
/* Add the parent route */
$route->setParent($parent);
/* Add/merge parent settings with child */
$route->setSettings($parent->toArray(), true);
}
if ($group !== null) {
/* Add the parent group */
$route->setGroup($group);
}
/* @var $route IGroupRoute */
if ($route instanceof IGroupRoute) {
$group = $route;
$this->processingRoute = true;
$route->renderRoute($this->request);
$this->processingRoute = false;
if ($route->matchRoute($url, $this->request) === true) {
/* Add exception handlers */
@@ -147,22 +159,10 @@ class Router
}
}
}
if ($group !== null) {
/* Add the parent group */
$route->setGroup($group);
}
if ($parent !== null) {
/* Add the parent route */
$route->setParent($parent);
/* Add/merge parent settings with child */
$route->setSettings($parent->toArray(), true);
$this->processingRoute = true;
$route->renderRoute($this->request);
$this->processingRoute = false;
}
if ($route instanceof ILoadableRoute) {
@@ -258,9 +258,7 @@ class Router
if ($rewriteUrl !== null && $rewriteUrl !== $url) {
unset($this->processedRoutes[$i]);
$this->processedRoutes = array_values($this->processedRoutes);
$this->routeRequest(true);
return;
return $this->routeRequest(true);
}
/* Render route */
@@ -268,8 +266,6 @@ class Router
$this->request->setLoadedRoute($route);
return $route->renderRoute($this->request);
break;
}
}
@@ -293,12 +289,15 @@ class Router
$this->handleException(new NotFoundHttpException($message, 404));
}
return null;
}
/**
* @param \Exception $e
* @throws HttpException
* @throws \Exception
* @return string
*/
protected function handleException(\Exception $e)
{
@@ -335,9 +334,7 @@ class Router
if ($rewriteUrl !== null && $rewriteUrl !== $url) {
unset($this->exceptionHandlers[$i]);
$this->exceptionHandlers = array_values($this->exceptionHandlers);
$this->routeRequest(true);
return;
return $this->routeRequest(true);
}
}
}