diff options
author | Arnold Daniels <arnold@jasny.net> | 2016-11-29 17:22:02 +0100 |
---|---|---|
committer | Arnold Daniels <arnold@jasny.net> | 2016-11-29 17:23:06 +0100 |
commit | 327c2d22068c155cf4e1ca4767d51e55990b119e (patch) | |
tree | 754cf36d2b71c255b38abb6bd2caf3749a19b02e | |
parent | 4431ae588f05da88b88ec4b2ba7f752568a7a020 (diff) | |
download | router-327c2d22068c155cf4e1ca4767d51e55990b119e.zip router-327c2d22068c155cf4e1ca4767d51e55990b119e.tar.gz router-327c2d22068c155cf4e1ca4767d51e55990b119e.tar.bz2 |
Added determine route middlewareorigin/determine-route-middleware
This middleware can determine the route at forehand, so it can be used by other middleware
-rw-r--r-- | src/Router/Middleware/DetermineRoute.php | 61 | ||||
-rw-r--r-- | tests/Router/Middleware/DetermineRouteTest.php | 72 |
2 files changed, 133 insertions, 0 deletions
diff --git a/src/Router/Middleware/DetermineRoute.php b/src/Router/Middleware/DetermineRoute.php new file mode 100644 index 0000000..fdb0878 --- /dev/null +++ b/src/Router/Middleware/DetermineRoute.php @@ -0,0 +1,61 @@ +<?php + +namespace Jasny\Router\Middleware; + +use Jasny\Router\Routes; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Determine the route at forehand, so it can be used by subsequent middleware + */ +class DetermineRoute +{ + /** + * Routes + * @var Routes + */ + protected $routes = null; + + + /** + * Class constructor + * + * @param Routes $routes + */ + public function __construct(Routes $routes) + { + $this->routes = $routes; + } + + /** + * Get routes + * + * @return Routes + */ + public function getRoutes() + { + return $this->routes; + } + + + /** + * Run middleware action + * + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @param callable $next + * @return ResponseInterface + */ + public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next) + { + if (!is_callable($next)) { + throw new \InvalidArgumentException("next should be callable"); + } + + $route = $this->routes->getRoute($request); + $requestWithRoute = $request->withAttribute('route', $route); + + return $next($requestWithRoute, $response); + } +} diff --git a/tests/Router/Middleware/DetermineRouteTest.php b/tests/Router/Middleware/DetermineRouteTest.php new file mode 100644 index 0000000..9e8d764 --- /dev/null +++ b/tests/Router/Middleware/DetermineRouteTest.php @@ -0,0 +1,72 @@ +<?php + +use Jasny\Router\Route; +use Jasny\Router\Routes; +use Jasny\Router\Middleware\DetermineRoute; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\ResponseInterface; + +use Jasny\Router\TestHelpers; + +/** + * @covers Jasny\Router\Middleware\DetermineRoute + */ +class DetermineRouteTest extends PHPUnit_Framework_TestCase +{ + use TestHelpers; + + public function testConstruct() + { + $routes = $this->createMock(Routes::class); + $middelware = new DetermineRoute($routes); + + $this->assertSame($routes, $middelware->getRoutes()); + } + + public function routeProvider() + { + return [ + [$this->createMock(Route::class)], + [null] + ]; + } + + /** + * @dataProvider routeProvider + * + * @param Route|null $route + */ + public function testInvoke($route) + { + $requestWithRoute = $this->createMock(ServerRequestInterface::class); + + $request = $this->createMock(ServerRequestInterface::class); + $request->expects($this->once())->method('withAttribute')->with('route', $route) + ->willReturn($requestWithRoute); + + $response = $this->createMock(ResponseInterface::class); + + $next = $this->createCallbackMock($this->once(), [$requestWithRoute, $response]); + + $routes = $this->createMock(Routes::class); + $routes->expects($this->once())->method('getRoute')->with($request)->willReturn($route); + + $middelware = new DetermineRoute($routes); + + $middelware($request, $response, $next); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInvokeWithInvalidCallback() + { + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $routes = $this->createMock(Routes::class); + $middelware = new DetermineRoute($routes); + + $middelware($request, $response, 'not a function'); + } +} |