Update Template Route to accept one parameter for the default variable pattern or map of patterns
This commit is contained in:
parent
d66ba80ec9
commit
6d9adfc7ee
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
);
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue