From 6d9adfc7ee7c95d2547b5f1eb2d37d35663e07ed Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Mon, 6 Apr 2015 19:55:04 -0400 Subject: [PATCH] Update Template Route to accept one parameter for the default variable pattern or map of patterns --- src/Routing/Route/RouteFactory.php | 7 +-- src/Routing/Route/TemplateRoute.php | 31 +++++------ src/Routing/Router.php | 7 +-- .../unit/Routing/Route/TemplateRouteTest.php | 55 +++++++------------ 4 files changed, 39 insertions(+), 61 deletions(-) diff --git a/src/Routing/Route/RouteFactory.php b/src/Routing/Route/RouteFactory.php index 83e0bd1..1995fd3 100644 --- a/src/Routing/Route/RouteFactory.php +++ b/src/Routing/Route/RouteFactory.php @@ -32,10 +32,9 @@ class RouteFactory * * @param string $target Path, prefix, or pattern to match * @param mixed $middleware Middleware to dispatch - * @param $defaultPattern @see TemplateRoute - * @param $variablePatterns @see TemplateRoute + * @param string|array $variablePattern @see TemplateRoute */ - public function registerRoute($target, $middleware, $defaultPattern = null, $variablePatterns = null) + public function registerRoute($target, $middleware, $variablePattern = null) { if ($target[0] === "/") { @@ -51,7 +50,7 @@ class RouteFactory // TempalateRoutes contain {variable} if (preg_match(TemplateRoute::URI_TEMPLATE_EXPRESSION_RE, $target)) { - $route = new TemplateRoute($target, $middleware, $defaultPattern, $variablePatterns); + $route = new TemplateRoute($target, $middleware, $variablePattern); $this->table->addRoute($route); } diff --git a/src/Routing/Route/TemplateRoute.php b/src/Routing/Route/TemplateRoute.php index ef6cf71..98f787e 100644 --- a/src/Routing/Route/TemplateRoute.php +++ b/src/Routing/Route/TemplateRoute.php @@ -25,18 +25,16 @@ class TemplateRoute extends RegexRoute * * @param string $template URI template the path must match * @param mixed $target Handler to dispatch - * @param string $defaultPattern Regular expression for variables - * @param array $variablePatterns Map of variable names and partial regular expression + * @param string|array $variablePattern Regular expression for variables * * @see BaseRoute for details about $target */ public function __construct( $template, $middleware, - $defaultPattern = self::RE_SLUG, - $variablePatterns = null + $variablePattern = self::RE_SLUG ) { - $pattern = $this->buildPattern($template, $defaultPattern, $variablePatterns); + $pattern = $this->buildPattern($template, $variablePattern); parent::__construct($pattern, $middleware); } @@ -44,22 +42,21 @@ class TemplateRoute extends RegexRoute * Translate the URI template into a regular expression. * * @param string $template URI template the path must match - * @param string $defaultPattern Regular expression for variables - * @param array $variablePatterns Map of variable names and regular expression + * @param string|array $variablePattern Regular expression for variables * @return string */ - private function buildPattern($template, $defaultPattern, $variablePatterns) + private function buildPattern($template, $variablePattern) { - // Ensure $variablePatterns is an array. - if (is_null($variablePatterns)) { - $variablePatterns = array(); - } elseif (is_object($variablePatterns)) { - $variablePatterns = (array) $variablePatterns; - } + $defaultPattern = self::RE_SLUG; + $variablePatterns = []; - // Ensure a default is set. - if (!$defaultPattern) { - $defaultPattern = self::RE_SLUG; + if (is_string($variablePattern)) { + $defaultPattern = $variablePattern; + } elseif (is_array($variablePattern)) { + $variablePatterns = $variablePattern; + if (isset($variablePatterns["*"])) { + $defaultPattern = $variablePatterns["*"]; + } } // Convert the template into the pattern diff --git a/src/Routing/Router.php b/src/Routing/Router.php index 71e1b46..1f6151b 100644 --- a/src/Routing/Router.php +++ b/src/Routing/Router.php @@ -38,15 +38,14 @@ class Router implements MiddlewareInterface * * @param string $target Path, prefix, or pattern to match * @param mixed $middleware Middleware to dispatch - * @param $defaultPattern @see TemplateRoute - * @param $variablePatterns @see TemplateRoute + * @param mixed $extra */ - public function add($target, $middleware, $defaultPattern = null, $variablePatterns = null) + public function add($target, $middleware, $extra = null) { if (is_array($middleware)) { $middleware = $this->getMethodMap($middleware); } - $this->routeFactory->registerRoute($target, $middleware, $defaultPattern, $variablePatterns); + $this->routeFactory->registerRoute($target, $middleware, $extra); } public function setStatusHandler($statusCode, $middleware) diff --git a/test/tests/unit/Routing/Route/TemplateRouteTest.php b/test/tests/unit/Routing/Route/TemplateRouteTest.php index 57a34ff..a64086e 100644 --- a/test/tests/unit/Routing/Route/TemplateRouteTest.php +++ b/test/tests/unit/Routing/Route/TemplateRouteTest.php @@ -26,18 +26,18 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase /** * @dataProvider matchingTemplateProvider */ - public function testMatchesTemplate($template, $default, $vars, $path) + public function testMatchesTemplate($template, $vars, $path) { - $route = new TemplateRoute($template, $this->middleware->reveal(), $default, $vars); + $route = new TemplateRoute($template, $this->middleware->reveal(), $vars); $this->assertTrue($route->matchesRequestTarget($path)); } /** * @dataProvider matchingTemplateProvider */ - public function testExtractsCaptures($template, $default, $vars, $path, $expectedCaptures) + public function testExtractsCaptures($template, $vars, $path, $expectedCaptures) { - $route = new TemplateRoute($template, $this->middleware->reveal(), $default, $vars); + $route = new TemplateRoute($template, $this->middleware->reveal(), $vars); $route->matchesRequestTarget($path, $captures); $this->assertEquals(0, count(array_diff_assoc($expectedCaptures, $captures))); } @@ -45,11 +45,9 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase public function matchingTemplateProvider() { return [ - ["/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/12", ["id" => "12"]], - [ - "/cat/{catId}/{dogId}", + ["/cat/{id}", TemplateRoute::RE_NUM, "/cat/12", ["id" => "12"]], + ["/cat/{catId}/{dogId}", TemplateRoute::RE_SLUG, - null, "/cat/molly/bear", [ "catId" => "molly", @@ -58,7 +56,6 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase ], [ "/cat/{catId}/{dogId}", - TemplateRoute::RE_NUM, [ "catId" => TemplateRoute::RE_SLUG, "dogId" => TemplateRoute::RE_SLUG @@ -69,24 +66,10 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase "dogId" => "bear" ] ], - [ - "/cat/{catId}/{dogId}", - TemplateRoute::RE_NUM, - (object) [ - "catId" => TemplateRoute::RE_SLUG, - "dogId" => TemplateRoute::RE_SLUG - ], - "/cat/molly/bear", - [ - "catId" => "molly", - "dogId" => "bear" - ] - ], - ["/cat/{id}/*", null, null, "/cat/12/molly", ["id" => "12"]], + ["/cat/{id}/*", null, "/cat/12/molly", ["id" => "12"]], [ "/cat/{id}-{width}x{height}.jpg", TemplateRoute::RE_NUM, - null, "/cat/17-200x100.jpg", [ "id" => "17", @@ -94,7 +77,7 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase "height" => "100" ] ], - ["/cat/{path}", ".*", null, "/cat/this/section/has/slashes", ["path" => "this/section/has/slashes"]] + ["/cat/{path}", ".*", "/cat/this/section/has/slashes", ["path" => "this/section/has/slashes"]] ]; } @@ -141,26 +124,26 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase /** * @dataProvider nonmatchingTemplateProvider */ - public function testFailsToMatchNonmatchingTemplate($template, $default, $vars, $path) + public function testFailsToMatchNonmatchingTemplate($template, $vars, $path) { - $route = new TemplateRoute($template, $this->middleware->reveal(), $default, $vars); + $route = new TemplateRoute($template, $this->middleware->reveal(), $vars); $this->assertFalse($route->matchesRequestTarget($path, $captures)); } public function nonmatchingTemplateProvider() { - return array( - array("/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/molly"), - array("/cat/{catId}/{dogId}", TemplateRoute::RE_ALPHA, null, "/cat/12/13"), - array( + return [ + ["/cat/{id}", TemplateRoute::RE_NUM, "/cat/molly"], + ["/cat/{catId}/{dogId}", TemplateRoute::RE_ALPHA, "/cat/12/13"], + [ "/cat/{catId}/{dogId}", - TemplateRoute::RE_NUM, - array( + [ + "*" => TemplateRoute::RE_NUM, "catId" => TemplateRoute::RE_ALPHA, "dogId" => TemplateRoute::RE_ALPHA - ), + ], "/cat/12/13" - ) - ); + ] + ]; } }