diff --git a/src/Context.php b/src/Context.php index 5f9381c..8b1656e 100644 --- a/src/Context.php +++ b/src/Context.php @@ -29,27 +29,59 @@ class Context * * @param ServerRequestInterface $request The server request object * @param array $params The route parameters + * @param string $routePath The registered route path */ public function __construct( private ServerRequestInterface $request, - private array $params + private array $params, + private string $routePath ) { $this->response = new Response(); - $this->req = new class ($request, $params) implements RequestWrapper { + $this->req = new class ($request, $params, $routePath) implements + RequestWrapper + { /** @var array The parsed request body */ private array $parsedBody; /** * @param ServerRequestInterface $request The server request object * @param array $params The route parameters + * @param string $routePath The registered route path */ public function __construct( private ServerRequestInterface $request, - private array $params + private array $params, + private string $routePath ) { $this->parsedBody = $this->parseBody(); } + /** + * Get the current request path + * + * This method returns the path component of the request URI. + * The path will be normalized to remove trailing slashes, except for the root path. + * + * @return string The current request path + */ + public function path(): string + { + return $this->request->getUri()->getPath(); + } + + /** + * Get the registered route path for the current request + * + * This method returns the original route path as it was registered, + * including any path parameters (e.g., '/posts/:id'). + * + * @return string The registered route path + */ + public function routePath(): string + { + return $this->routePath; + } + /** * Parse the request body based on content type * @@ -96,6 +128,22 @@ class Context return $this->params[$name] ?? null; } + /** + * Get query parameters as an array + * + * If the parameter is a comma-separated string, it will be split into an array. + * If the parameter is already an array, it will be returned as is. + * + * @param string $name The name of the query parameter + * @return array The query parameter value(s) as an array + */ + public function queries(string $name): array + { + $query = $this->request->getQueryParams(); + $value = $query[$name] ?? ""; + return is_array($value) ? $value : explode(",", $value); + } + /** * Get query parameters * @@ -141,6 +189,21 @@ class Context ? $this->request->getHeaders() : $this->request->getHeader($name); } + + /** + * Get a single header value + * + * Returns the first value of the specified header. If the header has multiple + * values, only the first one is returned. If the header doesn't exist, null is returned. + * + * @param string $name The name of the header + * @return string|null The header value, or null if the header doesn't exist + */ + public function header(string $name): ?string + { + $headers = $this->request->getHeader($name); + return !empty($headers) ? $headers[0] : null; + } }; } @@ -275,7 +338,7 @@ class Context * * @return ResponseInterface The response object */ - protected function getResponse(): ResponseInterface + public function getResponse(): ResponseInterface { return $this->response; } diff --git a/src/Dumbo.php b/src/Dumbo.php index c05500b..4467fcb 100644 --- a/src/Dumbo.php +++ b/src/Dumbo.php @@ -120,7 +120,7 @@ class Dumbo $this->matchPath($route["path"], $path) ) { $params = $this->extractParams($route["path"], $path); - $context = new Context($request, $params); + $context = new Context($request, $params, $route["path"]); $response = $this->runMiddleware($context, $route["handler"]); diff --git a/src/RequestWrapper.php b/src/RequestWrapper.php index 4d1b818..a6548ec 100644 --- a/src/RequestWrapper.php +++ b/src/RequestWrapper.php @@ -8,8 +8,12 @@ namespace Dumbo; interface RequestWrapper { public function param(string $name): ?string; + public function queries(string $name): array; public function query(?string $name = null): array|string|null; public function body(): array; public function method(): string; public function headers(?string $name = null): array; + public function header(string $name): ?string; + public function path(): string; + public function routePath(): string; }