fixed bug with grouped routes

pull/539/head
Austin Collier 12 months ago
parent 6e40f791c2
commit 660a642e8a

@ -64,6 +64,7 @@ use flight\net\Route;
* @method void etag(string $id, ('strong'|'weak') $type = 'strong') Handles ETag HTTP caching. * @method void etag(string $id, ('strong'|'weak') $type = 'strong') Handles ETag HTTP caching.
* @method void lastModified(int $time) Handles last modified HTTP caching. * @method void lastModified(int $time) Handles last modified HTTP caching.
*/ */
// phpcs:ignoreFile PSR2.Methods.MethodDeclaration.Underscore
class Engine class Engine
{ {
/** @var array<string, mixed> Stored variables. */ /** @var array<string, mixed> Stored variables. */

@ -78,7 +78,7 @@ class Dispatcher
* Assigns a callback to an event. * Assigns a callback to an event.
* *
* @param string $name Event name * @param string $name Event name
* @param Closure(): (void|mixed) $callback Callback function * @param Closure(): (void|mixed)|callable $callback Callback function
* *
* @return $this * @return $this
*/ */

@ -46,6 +46,13 @@ class Router
*/ */
protected array $group_middlewares = []; protected array $group_middlewares = [];
/**
* Allowed HTTP methods
*
* @var array<int, string>
*/
protected array $allowed_methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];
/** /**
* Gets mapped routes. * Gets mapped routes.
* *
@ -74,7 +81,19 @@ class Router
*/ */
public function map(string $pattern, callable $callback, bool $pass_route = false, string $route_alias = ''): Route public function map(string $pattern, callable $callback, bool $pass_route = false, string $route_alias = ''): Route
{ {
$url = trim($pattern);
// This means that the route ies defined in a group, but the defined route is the base
// url path. Note the '' in route()
// Ex: Flight::group('/api', function() {
// Flight::route('', function() {});
// }
// Keep the space so that it can execute the below code normally
if ($this->group_prefix !== '') {
$url = ltrim($pattern);
} else {
$url = trim($pattern);
}
$methods = ['*']; $methods = ['*'];
if (false !== strpos($url, ' ')) { if (false !== strpos($url, ' ')) {
@ -83,7 +102,12 @@ class Router
$methods = explode('|', $method); $methods = explode('|', $method);
} }
$route = new Route($this->group_prefix . $url, $callback, $methods, $pass_route, $route_alias); // And this finishes it off.
if ($this->group_prefix !== '') {
$url = rtrim($this->group_prefix . $url);
}
$route = new Route($url, $callback, $methods, $pass_route, $route_alias);
// to handle group middleware // to handle group middleware
foreach ($this->group_middlewares as $gm) { foreach ($this->group_middlewares as $gm) {

@ -459,6 +459,41 @@ class RouterTest extends TestCase
$this->check('123'); $this->check('123');
} }
public function testGroupRouteWithEmptyMapPath()
{
$this->router->group('/user', function (Router $router) {
$router->map('', function () {
echo "I'm a little teapot";
});
});
$this->request->url = '/user';
$this->check('I\'m a little teapot');
}
public function testGroupRouteWithEmptyGetPath()
{
$this->router->group('/user', function (Router $router) {
$router->get('', function () {
echo "I'm a little teapot";
});
});
$this->request->url = '/user';
$this->request->method = 'GET';
$this->check('I\'m a little teapot');
}
public function testGroupRouteWithEmptyMultipleMethodsPath()
{
$this->router->group('/user', function (Router $router) {
$router->map('GET|POST ', function () {
echo "I'm a little teapot";
});
});
$this->request->url = '/user';
$this->request->method = 'GET';
$this->check('I\'m a little teapot');
}
public function testGroupRoutesMultiParams() public function testGroupRoutesMultiParams()
{ {
$this->router->group('/user', function (Router $router) { $this->router->group('/user', function (Router $router) {

Loading…
Cancel
Save