Add RouteFactory
This commit is contained in:
parent
f788d9a2f3
commit
57271fa19f
|
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
|
||||
namespace WellRESTed\Routing\Route;
|
||||
|
||||
use ReflectionClass;
|
||||
use WellRESTed\Routing\RouteTableInterface;
|
||||
|
||||
/**
|
||||
* Class for creating routes
|
||||
*/
|
||||
class RouteFactory
|
||||
{
|
||||
/** @var RouteTableInterface */
|
||||
private $table;
|
||||
|
||||
public function __construct(RouteTableInterface $table)
|
||||
{
|
||||
$this->table = $table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and return a route given a string path, a handler, and optional
|
||||
* extra arguments.
|
||||
*
|
||||
* The method will determine the most appropriate route subclass to use
|
||||
* and will forward the arguments on to the subclass's constructor.
|
||||
*
|
||||
* - Paths with no special characters will generate StaticRoutes
|
||||
* - Paths ending with * will generate PrefixRoutes
|
||||
* - Paths containing URI variables (e.g., {id}) will generate TemplateRoutes
|
||||
* - Regular exressions will generate RegexRoutes
|
||||
*
|
||||
* @param string $target Path, prefix, or pattern to match
|
||||
* @param mixed $middleware Middleware to dispatch
|
||||
* @param $defaultPattern @see TemplateRoute
|
||||
* @param $variablePatterns @see TemplateRoute
|
||||
*/
|
||||
public function registerRoute($target, $middleware, $defaultPattern = null, $variablePatterns = null)
|
||||
{
|
||||
if ($target[0] === "/") {
|
||||
|
||||
// Possible static, prefix, or template
|
||||
|
||||
// PrefixRoutes end with *
|
||||
if (substr($target, -1) === "*") {
|
||||
// Remove the trailing *, since the PrefixRoute constructor doesn't expect it.
|
||||
$target = substr($target, 0, -1);
|
||||
$route = new PrefixRoute($target, $middleware);
|
||||
$this->table->addPrefixRoute($route);
|
||||
}
|
||||
|
||||
// TempalateRoutes contain {variable}
|
||||
if (preg_match(TemplateRoute::URI_TEMPLATE_EXPRESSION_RE, $target)) {
|
||||
$route = new TemplateRoute($target, $middleware, $defaultPattern, $variablePatterns);
|
||||
$this->table->addRoute($route);
|
||||
}
|
||||
|
||||
// StaticRoute
|
||||
$route = new StaticRoute($target, $middleware);
|
||||
$this->table->addStaticRoute($route);
|
||||
}
|
||||
|
||||
// Regex
|
||||
$route = new RegexRoute($target, $middleware);
|
||||
$this->table->addRoute($route);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
namespace WellRESTed\Test\Unit\Routing\Route;
|
||||
|
||||
use Prophecy\Argument;
|
||||
use WellRESTed\Routing\Route\RouteFactory;
|
||||
|
||||
/**
|
||||
* @covers WellRESTed\Routing\Route\RouteFactory
|
||||
* @uses WellRESTed\Routing\Route\TemplateRoute
|
||||
* @uses WellRESTed\Routing\Route\RegexRoute
|
||||
* @uses WellRESTed\Routing\Route\PrefixRoute
|
||||
* @uses WellRESTed\Routing\Route\StaticRoute
|
||||
* @uses WellRESTed\Routing\Route\Route
|
||||
*/
|
||||
class RouteFactoryTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
private $routeTable;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
$this->routeTable = $this->prophesize("\\WellRESTed\\Routing\\RouteTableInterface");
|
||||
$this->routeTable->addStaticRoute(Argument::cetera())->willReturn();
|
||||
$this->routeTable->addPrefixRoute(Argument::cetera())->willReturn();
|
||||
$this->routeTable->addRoute(Argument::cetera())->willReturn();
|
||||
}
|
||||
|
||||
public function testRegistersStaticRoute()
|
||||
{
|
||||
$factory = new RouteFactory($this->routeTable->reveal());
|
||||
$factory->registerRoute("/cats/", null);
|
||||
$this->routeTable->addStaticRoute(Argument::any())->shouldHaveBeenCalled();
|
||||
}
|
||||
|
||||
public function testRegistersPrefixRoute()
|
||||
{
|
||||
$factory = new RouteFactory($this->routeTable->reveal());
|
||||
$factory->registerRoute("/cats/*", null);
|
||||
$this->routeTable->addPrefixRoute(Argument::any())->shouldHaveBeenCalled();
|
||||
}
|
||||
|
||||
public function testRegistersTemplateRoute()
|
||||
{
|
||||
$factory = new RouteFactory($this->routeTable->reveal());
|
||||
$factory->registerRoute("/cats/{catId}", null);
|
||||
$this->routeTable->addRoute(Argument::type("\\WellRESTed\\Routing\\Route\\TemplateRoute"))->shouldHaveBeenCalled();
|
||||
}
|
||||
|
||||
public function testRegistersRegexRoute()
|
||||
{
|
||||
$factory = new RouteFactory($this->routeTable->reveal());
|
||||
$factory->registerRoute("~/cat/[0-9]+~", null);
|
||||
$this->routeTable->addRoute(Argument::type("\\WellRESTed\\Routing\\Route\\RegexRoute"))->shouldHaveBeenCalled();
|
||||
$this->routeTable->addRoute(Argument::type("\\WellRESTed\\Routing\\Route\\TemplateRoute"))->shouldNotHaveBeenCalled();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue