Update Template Route to accept one parameter for the default variable pattern or map of patterns

This commit is contained in:
PJ Dietz 2015-04-06 19:55:04 -04:00
parent d66ba80ec9
commit 6d9adfc7ee
4 changed files with 39 additions and 61 deletions

View File

@ -32,10 +32,9 @@ class RouteFactory
* *
* @param string $target Path, prefix, or pattern to match * @param string $target Path, prefix, or pattern to match
* @param mixed $middleware Middleware to dispatch * @param mixed $middleware Middleware to dispatch
* @param $defaultPattern @see TemplateRoute * @param string|array $variablePattern @see TemplateRoute
* @param $variablePatterns @see TemplateRoute
*/ */
public function registerRoute($target, $middleware, $defaultPattern = null, $variablePatterns = null) public function registerRoute($target, $middleware, $variablePattern = null)
{ {
if ($target[0] === "/") { if ($target[0] === "/") {
@ -51,7 +50,7 @@ class RouteFactory
// TempalateRoutes contain {variable} // TempalateRoutes contain {variable}
if (preg_match(TemplateRoute::URI_TEMPLATE_EXPRESSION_RE, $target)) { 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); $this->table->addRoute($route);
} }

View File

@ -25,18 +25,16 @@ class TemplateRoute extends RegexRoute
* *
* @param string $template URI template the path must match * @param string $template URI template the path must match
* @param mixed $target Handler to dispatch * @param mixed $target Handler to dispatch
* @param string $defaultPattern Regular expression for variables * @param string|array $variablePattern Regular expression for variables
* @param array $variablePatterns Map of variable names and partial regular expression
* *
* @see BaseRoute for details about $target * @see BaseRoute for details about $target
*/ */
public function __construct( public function __construct(
$template, $template,
$middleware, $middleware,
$defaultPattern = self::RE_SLUG, $variablePattern = self::RE_SLUG
$variablePatterns = null
) { ) {
$pattern = $this->buildPattern($template, $defaultPattern, $variablePatterns); $pattern = $this->buildPattern($template, $variablePattern);
parent::__construct($pattern, $middleware); parent::__construct($pattern, $middleware);
} }
@ -44,22 +42,21 @@ class TemplateRoute extends RegexRoute
* Translate the URI template into a regular expression. * Translate the URI template into a regular expression.
* *
* @param string $template URI template the path must match * @param string $template URI template the path must match
* @param string $defaultPattern Regular expression for variables * @param string|array $variablePattern Regular expression for variables
* @param array $variablePatterns Map of variable names and regular expression
* @return string * @return string
*/ */
private function buildPattern($template, $defaultPattern, $variablePatterns) private function buildPattern($template, $variablePattern)
{ {
// Ensure $variablePatterns is an array. $defaultPattern = self::RE_SLUG;
if (is_null($variablePatterns)) { $variablePatterns = [];
$variablePatterns = array();
} elseif (is_object($variablePatterns)) {
$variablePatterns = (array) $variablePatterns;
}
// Ensure a default is set. if (is_string($variablePattern)) {
if (!$defaultPattern) { $defaultPattern = $variablePattern;
$defaultPattern = self::RE_SLUG; } elseif (is_array($variablePattern)) {
$variablePatterns = $variablePattern;
if (isset($variablePatterns["*"])) {
$defaultPattern = $variablePatterns["*"];
}
} }
// Convert the template into the pattern // Convert the template into the pattern

View File

@ -38,15 +38,14 @@ class Router implements MiddlewareInterface
* *
* @param string $target Path, prefix, or pattern to match * @param string $target Path, prefix, or pattern to match
* @param mixed $middleware Middleware to dispatch * @param mixed $middleware Middleware to dispatch
* @param $defaultPattern @see TemplateRoute * @param mixed $extra
* @param $variablePatterns @see TemplateRoute
*/ */
public function add($target, $middleware, $defaultPattern = null, $variablePatterns = null) public function add($target, $middleware, $extra = null)
{ {
if (is_array($middleware)) { if (is_array($middleware)) {
$middleware = $this->getMethodMap($middleware); $middleware = $this->getMethodMap($middleware);
} }
$this->routeFactory->registerRoute($target, $middleware, $defaultPattern, $variablePatterns); $this->routeFactory->registerRoute($target, $middleware, $extra);
} }
public function setStatusHandler($statusCode, $middleware) public function setStatusHandler($statusCode, $middleware)

View File

@ -26,18 +26,18 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase
/** /**
* @dataProvider matchingTemplateProvider * @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)); $this->assertTrue($route->matchesRequestTarget($path));
} }
/** /**
* @dataProvider matchingTemplateProvider * @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); $route->matchesRequestTarget($path, $captures);
$this->assertEquals(0, count(array_diff_assoc($expectedCaptures, $captures))); $this->assertEquals(0, count(array_diff_assoc($expectedCaptures, $captures)));
} }
@ -45,11 +45,9 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase
public function matchingTemplateProvider() public function matchingTemplateProvider()
{ {
return [ return [
["/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/12", ["id" => "12"]], ["/cat/{id}", TemplateRoute::RE_NUM, "/cat/12", ["id" => "12"]],
[ ["/cat/{catId}/{dogId}",
"/cat/{catId}/{dogId}",
TemplateRoute::RE_SLUG, TemplateRoute::RE_SLUG,
null,
"/cat/molly/bear", "/cat/molly/bear",
[ [
"catId" => "molly", "catId" => "molly",
@ -58,7 +56,6 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase
], ],
[ [
"/cat/{catId}/{dogId}", "/cat/{catId}/{dogId}",
TemplateRoute::RE_NUM,
[ [
"catId" => TemplateRoute::RE_SLUG, "catId" => TemplateRoute::RE_SLUG,
"dogId" => TemplateRoute::RE_SLUG "dogId" => TemplateRoute::RE_SLUG
@ -69,24 +66,10 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase
"dogId" => "bear" "dogId" => "bear"
] ]
], ],
[ ["/cat/{id}/*", null, "/cat/12/molly", ["id" => "12"]],
"/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}-{width}x{height}.jpg", "/cat/{id}-{width}x{height}.jpg",
TemplateRoute::RE_NUM, TemplateRoute::RE_NUM,
null,
"/cat/17-200x100.jpg", "/cat/17-200x100.jpg",
[ [
"id" => "17", "id" => "17",
@ -94,7 +77,7 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase
"height" => "100" "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 * @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)); $this->assertFalse($route->matchesRequestTarget($path, $captures));
} }
public function nonmatchingTemplateProvider() public function nonmatchingTemplateProvider()
{ {
return array( return [
array("/cat/{id}", TemplateRoute::RE_NUM, null, "/cat/molly"), ["/cat/{id}", TemplateRoute::RE_NUM, "/cat/molly"],
array("/cat/{catId}/{dogId}", TemplateRoute::RE_ALPHA, null, "/cat/12/13"), ["/cat/{catId}/{dogId}", TemplateRoute::RE_ALPHA, "/cat/12/13"],
array( [
"/cat/{catId}/{dogId}", "/cat/{catId}/{dogId}",
TemplateRoute::RE_NUM, [
array( "*" => TemplateRoute::RE_NUM,
"catId" => TemplateRoute::RE_ALPHA, "catId" => TemplateRoute::RE_ALPHA,
"dogId" => TemplateRoute::RE_ALPHA "dogId" => TemplateRoute::RE_ALPHA
), ],
"/cat/12/13" "/cat/12/13"
) ]
); ];
} }
} }