diff --git a/src/Pecee/SimpleRouter/Router.php b/src/Pecee/SimpleRouter/Router.php index d9e642b..6f8781d 100644 --- a/src/Pecee/SimpleRouter/Router.php +++ b/src/Pecee/SimpleRouter/Router.php @@ -110,6 +110,13 @@ class Router */ protected $classLoader; + /** + * When enabled the router will render all routes that matches. + * When disabled the router will stop execution when first route is found. + * @var bool + */ + protected $renderMultipleRoutes = true; + /** * Router constructor. */ @@ -399,14 +406,21 @@ class Router 'route' => $route, ]); - $output = $route->renderRoute($this->request, $this); - if ($output !== null) { - return $output; - } + $routeOutput = $route->renderRoute($this->request, $this); - $output = $this->handleRouteRewrite($key, $url); - if ($output !== null) { - return $output; + if ($this->renderMultipleRoutes === true) { + if ($routeOutput !== null) { + return $routeOutput; + } + + $output = $this->handleRouteRewrite($key, $url); + if ($output !== null) { + return $output; + } + } else { + $output = $this->handleRouteRewrite($key, $url); + + return $output ?? $routeOutput; } } } @@ -912,4 +926,19 @@ class Router return $this->debugList; } + /** + * Changes the rendering behavior of the router. + * When enabled the router will render all routes that matches. + * When disabled the router will stop rendering at the first route that matches. + * + * @param bool $bool + * @return $this + */ + public function setRenderMultipleRoutes(bool $bool): self + { + $this->renderMultipleRoutes = $bool; + + return $this; + } + } \ No newline at end of file diff --git a/src/Pecee/SimpleRouter/SimpleRouter.php b/src/Pecee/SimpleRouter/SimpleRouter.php index 284078b..2e79055 100644 --- a/src/Pecee/SimpleRouter/SimpleRouter.php +++ b/src/Pecee/SimpleRouter/SimpleRouter.php @@ -532,6 +532,18 @@ class SimpleRouter return $route; } + /** + * Changes the rendering behavior of the router. + * When enabled the router will render all routes that matches. + * When disabled the router will stop rendering at the first route that matches. + * + * @param bool $bool + */ + public static function enableMultiRouteRendering(bool $bool): void + { + static::router()->setRenderMultipleRoutes($bool); + } + /** * Enable or disable dependency injection * diff --git a/tests/Pecee/SimpleRouter/RouterUrlTest.php b/tests/Pecee/SimpleRouter/RouterUrlTest.php index 2aa4706..8a1d1fa 100644 --- a/tests/Pecee/SimpleRouter/RouterUrlTest.php +++ b/tests/Pecee/SimpleRouter/RouterUrlTest.php @@ -11,7 +11,7 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase { TestRouter::get('/', 'DummyController@method1'); TestRouter::get('/page/{id?}', 'DummyController@method1'); - TestRouter::get('/test-output', function() { + TestRouter::get('/test-output', function () { return 'return value'; }); @@ -175,7 +175,7 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase { TestRouter::request()->setHost('google.com'); - TestRouter::get('/admin/', function() { + TestRouter::get('/admin/', function () { return 'match'; })->setMatch('/^\/admin\/?(.*)/i'); @@ -183,4 +183,42 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase $this->assertEquals('match', $output); } + public function testRenderMultipleRoutesDisabled() + { + TestRouter::router()->setRenderMultipleRoutes(false); + + $result = false; + + TestRouter::get('/', function () use (&$result) { + $result = true; + }); + + TestRouter::get('/', function () use (&$result) { + $result = false; + }); + + TestRouter::debug('/'); + + $this->assertTrue($result); + } + + public function testRenderMultipleRoutesEnabled() + { + TestRouter::router()->setRenderMultipleRoutes(true); + + $result = []; + + TestRouter::get('/', function () use (&$result) { + $result[] = 'route1'; + }); + + TestRouter::get('/', function () use (&$result) { + $result[] = 'route2'; + }); + + TestRouter::debug('/'); + + $this->assertCount(2, $result); + } + } \ No newline at end of file