From d4830dc2a6fa98bc756cda1a9850004177a6e8c5 Mon Sep 17 00:00:00 2001 From: Gabriel Solomon Date: Tue, 26 Mar 2019 10:03:41 +0200 Subject: [PATCH] update matcher methods to rely on symfony more --- .idea/router.iml | 2 + composer.json | 7 +- legacy/Route/AbstractRouteTrait.php | 20 ++++++ legacy/Router/Traits/HasMatcherTrait.php | 25 +++++++ phpunit.xml.dist | 7 +- src/Route/AbstractRoute.php | 16 ++--- src/Router.php | 5 +- src/Router/Traits/HasMatcherTrait.php | 27 ++----- src/functions/url-generation.php | 5 +- tests/legacy/Route/AbstractRouteTraitTest.php | 23 ++++++ .../Router/Traits/HasMatcherTraitTest.php | 72 +++++++++++++++++++ .../src/Router/Traits/HasMatcherTraitTest.php | 37 ++++++---- tests/src/RouterTest.php | 2 +- 13 files changed, 194 insertions(+), 54 deletions(-) create mode 100644 legacy/Route/AbstractRouteTrait.php create mode 100644 legacy/Router/Traits/HasMatcherTrait.php create mode 100644 tests/legacy/Route/AbstractRouteTraitTest.php create mode 100644 tests/legacy/Router/Traits/HasMatcherTraitTest.php diff --git a/.idea/router.iml b/.idea/router.iml index 5761f67..774f361 100644 --- a/.idea/router.iml +++ b/.idea/router.iml @@ -2,8 +2,10 @@ + + diff --git a/composer.json b/composer.json index 7374845..89dee2b 100644 --- a/composer.json +++ b/composer.json @@ -12,9 +12,11 @@ ], "autoload": { "psr-4": { - "Nip\\Router\\": "src" + "Nip\\Router\\": "src", + "Nip\\Router\\Legacy\\": "legacy" }, "classmap": [ + "legacy", "src" ], "files": [ @@ -24,7 +26,8 @@ "psr-4": { "Nip\\Router\\Tests\\Fixtures\\Application\\": "tests/fixtures/application", "Nip\\Router\\Tests\\Fixtures\\": "tests/fixtures", - "Nip\\Router\\Tests\\": "tests/src" + "Nip\\Router\\Tests\\": "tests/src", + "Nip\\Router\\Tests\\Legacy\\": "tests/legacy" } }, "require": { diff --git a/legacy/Route/AbstractRouteTrait.php b/legacy/Route/AbstractRouteTrait.php new file mode 100644 index 0000000..e4b9ba8 --- /dev/null +++ b/legacy/Route/AbstractRouteTrait.php @@ -0,0 +1,20 @@ +getParser()->setParams($params); + $this->setDefaults($params); + } +} \ No newline at end of file diff --git a/legacy/Router/Traits/HasMatcherTrait.php b/legacy/Router/Traits/HasMatcherTrait.php new file mode 100644 index 0000000..a34c60d --- /dev/null +++ b/legacy/Router/Traits/HasMatcherTrait.php @@ -0,0 +1,25 @@ +matchRequest($request); + return $return; + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e1014e3..08331c1 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -17,8 +17,11 @@ > - - ./tests + + ./tests/src + + + ./tests/legacy diff --git a/src/Route/AbstractRoute.php b/src/Route/AbstractRoute.php index 52a6adc..5c2a2cc 100644 --- a/src/Route/AbstractRoute.php +++ b/src/Route/AbstractRoute.php @@ -2,6 +2,7 @@ namespace Nip\Router\Route; +use Nip\Router\Legacy\Route\AbstractRouteTrait; use Nip\Router\Parsers\Dynamic; use Nip\Router\Route\Traits\HasMatchTrait; use Nip\Router\Route\Traits\HasParserTrait; @@ -16,6 +17,8 @@ */ abstract class AbstractRoute extends \Symfony\Component\Routing\Route { + use AbstractRouteTrait; + use NameWorksTrait; use HasParserTrait; use HasTypeTrait; @@ -37,9 +40,9 @@ abstract class AbstractRoute extends \Symfony\Component\Routing\Route /** * AbstractRoute constructor. * @param bool $map - * @param array $params + * @param array $defaults */ - public function __construct($map = false, $params = []) + public function __construct($map = false, $defaults = []) { if ($map) { $parser = $this->getParser(); @@ -49,17 +52,10 @@ public function __construct($map = false, $params = []) } } - parent::__construct($map); - - - if (count($params)) { - $this->getParser()->setParams($params); - $this->setDefaults($params); - } + parent::__construct($map, $defaults); $this->init(); } - public function init() { } diff --git a/src/Router.php b/src/Router.php index 3e95d69..96a332c 100644 --- a/src/Router.php +++ b/src/Router.php @@ -6,6 +6,7 @@ use Nip\Router\Generator\UrlGenerator; use Nip\Router\Router\Traits\HasCurrentRouteTrait; use Nip\Router\Router\Traits\HasGeneratorTrait; +use Nip\Router\Legacy\Router\Traits\HasMatcherTrait as LegacyHasMatcherTrait; use Nip\Router\Router\Traits\HasMatcherTrait; use Nip\Router\Router\Traits\HasRouteCollectionTrait; use Psr\Log\LoggerInterface; @@ -18,10 +19,12 @@ */ class Router extends \Symfony\Component\Routing\Router { + use LegacyHasMatcherTrait; + use HasRouteCollectionTrait; use HasCurrentRouteTrait; - use HasMatcherTrait; use HasGeneratorTrait; + use HasMatcherTrait; /** * @inheritdoc diff --git a/src/Router/Traits/HasMatcherTrait.php b/src/Router/Traits/HasMatcherTrait.php index 7c3e1f9..c30b956 100644 --- a/src/Router/Traits/HasMatcherTrait.php +++ b/src/Router/Traits/HasMatcherTrait.php @@ -2,7 +2,7 @@ namespace Nip\Router\Router\Traits; -use Nip\Request; +use \Symfony\Component\HttpFoundation\Request; use Nip\Router\Route\Route; use Psr\Http\Message\ServerRequestInterface; @@ -16,27 +16,12 @@ trait HasMatcherTrait * @param Request|ServerRequestInterface $request * @return array */ - public function route($request) + public function matchRequest(Request $request) { - $current = false; - $uri = $request->path(); - $routes = $this->getRoutes(); - - foreach ($routes as $name => $route) { - $route->setRequest($request); - if ($route->match($uri)) { - $current = $route; - break; - } - } - - if ($current instanceof Route) { - $this->setCurrent($current); - $current->populateRequest(); - - return $current->getParams() + $current->getMatches(); - } else { - return []; + $return = parent::matchRequest($request); + if (isset($return['_route'])) { + $this->setCurrent($this->getRoute($return['_route'])); } + return $return; } } diff --git a/src/functions/url-generation.php b/src/functions/url-generation.php index ead4f04..5c8049d 100644 --- a/src/functions/url-generation.php +++ b/src/functions/url-generation.php @@ -6,6 +6,7 @@ * @param $name * @param array $parameters * @param bool $absolute + * @return string|null */ function route($name, $parameters = [], $absolute = true) { @@ -13,7 +14,7 @@ function route($name, $parameters = [], $absolute = true) return null; } if ($absolute === true) { - return app('router')->assembleFull($name); + return app('router')->assembleFull($name, $parameters); } - return app('router')->assemble($name); + return app('router')->assemble($name, $parameters); } diff --git a/tests/legacy/Route/AbstractRouteTraitTest.php b/tests/legacy/Route/AbstractRouteTraitTest.php new file mode 100644 index 0000000..e8e8bbe --- /dev/null +++ b/tests/legacy/Route/AbstractRouteTraitTest.php @@ -0,0 +1,23 @@ +getDefaults()); + + $params = ['test' => 9]; + $route->setParams($params); + self::assertSame($params, $route->getDefaults()); + } +} diff --git a/tests/legacy/Router/Traits/HasMatcherTraitTest.php b/tests/legacy/Router/Traits/HasMatcherTraitTest.php new file mode 100644 index 0000000..f2b69a5 --- /dev/null +++ b/tests/legacy/Router/Traits/HasMatcherTraitTest.php @@ -0,0 +1,72 @@ +route($request); + } + + public function testRouteLiteral() + { + $router = new Router(); + $collection = $router->getRoutes(); + + RouteFactory::generateLiteralRoute($collection, "admin.index", Route::class, "/admin", "/index"); + RouteFactory::generateLiteralRoute($collection, "api.index", Route::class, "/api", "/index"); + + $request = Request::create('/api/index'); + $params = $router->route($request); + self::assertEquals(['_route' => 'api.index'], $params); + + $currentRoute = $router->getCurrent(); + self::assertInstanceOf(Route::class, $currentRoute); + self::assertEquals('api.index', $currentRoute->getName()); + + $request = Request::create('/admin/index'); + $router->route($request); + self::assertEquals('admin.index', $router->getCurrent()->getName()); + } + + public function testRouteDynamic() + { + $router = new Router(); + $collection = $router->getRoutes(); + + RouteFactory::generateStandardRoute($collection, "admin.standard", StandardRoute::class, "/admin", + '/:controller/:action', ['module' => 'admin']); + RouteFactory::generateStandardRoute($collection, "api.standard", StandardRoute::class, "/api", + '/:controller/:action', ['module' => 'api']); + + $request = Request::create('/api/pages/delete'); + self::assertEquals( + ['module' => 'api', 'controller' => 'pages', 'action' => 'delete','_route' => 'api.standard'], + $router->route($request) + ); + + $request = Request::create('/admin/pages/delete'); + self::assertEquals( + ['module' => 'admin', 'controller' => 'pages', 'action' => 'delete', '_route' => 'admin.standard'], + $router->route($request) + ); + } +} diff --git a/tests/src/Router/Traits/HasMatcherTraitTest.php b/tests/src/Router/Traits/HasMatcherTraitTest.php index a86a648..196dbbd 100644 --- a/tests/src/Router/Traits/HasMatcherTraitTest.php +++ b/tests/src/Router/Traits/HasMatcherTraitTest.php @@ -8,6 +8,7 @@ use Nip\Router\Router; use Nip\Router\Tests\AbstractTest; use Nip\Router\Tests\Fixtures\Application\Library\Router\Route\StandardRoute; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; /** * Class HasMatcherTraitTest @@ -15,6 +16,16 @@ */ class HasMatcherTraitTest extends AbstractTest { + + public function testNotFound() + { + $router = new Router(); + self::expectException(ResourceNotFoundException::class); + + $request = Request::create('/404'); + $router->matchRequest($request); + } + public function testRouteLiteral() { $router = new Router(); @@ -23,21 +34,17 @@ public function testRouteLiteral() RouteFactory::generateLiteralRoute($collection, "admin.index", Route::class, "/admin", "/index"); RouteFactory::generateLiteralRoute($collection, "api.index", Route::class, "/api", "/index"); - $request = Request::create('/api/404'); - $router->route($request); - self::assertNull($router->getCurrent()); - $request = Request::create('/api/index'); - $params = $router->route($request); - self::assertSame([], $params); + $params = $router->matchRequest($request); + self::assertEquals(['_route' => 'api.index'], $params); $currentRoute = $router->getCurrent(); self::assertInstanceOf(Route::class, $currentRoute); - self::assertSame('api.index', $currentRoute->getName()); + self::assertEquals('api.index', $currentRoute->getName()); $request = Request::create('/admin/index'); - $router->route($request); - self::assertSame('admin.index', $router->getCurrent()->getName()); + $router->matchRequest($request); + self::assertEquals('admin.index', $router->getCurrent()->getName()); } public function testRouteDynamic() @@ -51,15 +58,15 @@ public function testRouteDynamic() '/:controller/:action', ['module' => 'api']); $request = Request::create('/api/pages/delete'); - self::assertSame( - ['module' => 'api', 'controller' => 'pages', 'action' => 'delete'], - $router->route($request) + self::assertEquals( + ['module' => 'api', 'controller' => 'pages', 'action' => 'delete', '_route' => 'api.standard'], + $router->matchRequest($request) ); $request = Request::create('/admin/pages/delete'); - self::assertSame( - ['module' => 'admin', 'controller' => 'pages', 'action' => 'delete'], - $router->route($request) + self::assertEquals( + ['module' => 'admin', 'controller' => 'pages', 'action' => 'delete', '_route' => 'admin.standard'], + $router->matchRequest($request) ); } } diff --git a/tests/src/RouterTest.php b/tests/src/RouterTest.php index 6d7f982..c41f08a 100644 --- a/tests/src/RouterTest.php +++ b/tests/src/RouterTest.php @@ -61,7 +61,7 @@ public function testMatchRequestWithStandardRoute() $request = Request::create('/admin/post/create'); $params = $router->matchRequest($request); - self::assertSame( + self::assertEquals( ['module' => 'admin', 'controller' => 'post', 'action' => 'create', '_route' => 'admin.standard'], $params );