/** * @param \Psr\Http\Message\ServerRequestInterface $request * @return \Psr\Http\Message\ResponseInterface */ public function dispatch(ServerRequestInterface $request) { $cacheEnabled = $this->config->isCacheEnabled(); $cacheFile = $this->config->getCacheFile(); if ($cacheEnabled && file_exists($cacheFile)) { $cacheData = (require $cacheFile); $dispatchData = $cacheData['dispatch_data']; $routes = $cacheData['routes']; } else { $router = new Router(); if ($this->routes) { $router->middleware($this->config->getMiddleware(), function (Router $router) { $router->append($this->routes); }); } $dispatchData = $router->getCollector()->getData(); $routes = $router->getRoutes(); } if ($cacheEnabled) { file_put_contents($cacheFile, '<?php return ' . var_export(['dispatch_data' => $dispatchData, 'routes' => $routes], true) . ';'); } $request = $this->applyVirtualMethod($request); $routeInfo = $this->runDispatcher(new GCBDispatcher($dispatchData), $request->getMethod(), $request->getUri()->getPath()); foreach ($routeInfo[2] as $key => $value) { $request = $request->withAttribute($key, $value); } return $routes[$routeInfo[1]]->execute($request, $this->classLoader, $this->responsifier); }
public function testGroupSlashSensitive() { $router = new Router(); $router->get('', function () { return '/!'; }); $router->group('/hello', function () use($router) { $router->get('', function () { return '/hello!'; }); $router->get('/', function () { return '/hello/!'; }); $router->get('///abc', function () { return '/hello///abc!'; }); }); $mockRequest = Mockery::mock(ServerRequestInterface::class); $mockRequest->shouldReceive('getParsedBody')->andReturn([]); $mockRequest->shouldReceive('getMethod')->andReturn('GET'); $mockRequest->shouldReceive('getUri->getPath')->andReturn('/hello'); $this->assertEquals('/hello!', $router->dispatch($mockRequest)); $mockRequest = Mockery::mock(ServerRequestInterface::class); $mockRequest->shouldReceive('getParsedBody')->andReturn([]); $mockRequest->shouldReceive('getMethod')->andReturn('GET'); $mockRequest->shouldReceive('getUri->getPath')->andReturn('/hello/'); $this->assertEquals('/hello/!', $router->dispatch($mockRequest)); $mockRequest = Mockery::mock(ServerRequestInterface::class); $mockRequest->shouldReceive('getParsedBody')->andReturn([]); $mockRequest->shouldReceive('getMethod')->andReturn('GET'); $mockRequest->shouldReceive('getUri->getPath')->andReturn('/hello///abc'); $this->assertEquals('/hello///abc!', $router->dispatch($mockRequest)); }