*/ private array $routeParams; /** * @param array $routeParams */ public function __construct(Psr7Request $request, string $basePath = '', array $routeParams = []) { $this->request = $request; $this->basePath = $basePath; $this->routeParams = $routeParams; } /** * Get a route or query parameter. Route params have a higher priority. * * @todo Don't support NULL $name. * @deprecated For backward compatibility. * * @return mixed */ public function get(?string $name = null) { if (is_null($name)) { return array_merge( $this->getQueryParams(), $this->routeParams ); } if ($this->hasRouteParam($name)) { return $this->getRouteParam($name); } return $this->request->getQueryParams()[$name] ?? null; } public function hasRouteParam(string $name): bool { return array_key_exists($name, $this->routeParams); } public function getRouteParam(string $name): ?string { return $this->routeParams[$name] ?? null; } /** * @return array */ public function getRouteParams(): array { return $this->routeParams; } public function hasQueryParam(string $name): bool { return array_key_exists($name, $this->request->getQueryParams()); } public function getQueryParam(string $name): ?string { $value = $this->request->getQueryParams()[$name] ?? null; if (!is_string($value)) { return null; } return $value; } public function getQueryParams(): array { return $this->request->getQueryParams(); } public function getHeader(string $name): ?string { if (!$this->request->hasHeader($name)) { return null; } return $this->request->getHeaderLine($name); } public function hasHeader(string $name): bool { return $this->request->hasHeader($name); } /** * @return string[] */ public function getHeaderAsArray(string $name): array { if (!$this->request->hasHeader($name)) { return []; } return $this->request->getHeader($name); } public function getMethod(): string { return $this->request->getMethod(); } public function getContentType(): ?string { if (!$this->hasHeader('Content-Type')) { return null; } $contentType = explode( ';', $this->request->getHeader('Content-Type')[0] )[0]; return strtolower($contentType); } public function getBodyContents(): ?string { $contents = $this->request->getBody()->getContents(); $this->request->getBody()->rewind(); return $contents; } public function getParsedBody(): stdClass { if ($this->parsedBody === null) { $this->initParsedBody(); } if ($this->parsedBody === null) { throw new Error(); } return Util::cloneObject($this->parsedBody); } private function initParsedBody(): void { $contents = $this->getBodyContents(); if ($this->getContentType() === 'application/json' && $contents) { $parsedBody = Json::decode($contents); if (is_array($parsedBody)) { $parsedBody = (object) [ 'list' => $parsedBody, ]; } if (!$parsedBody instanceof stdClass) { throw new Error("Body is not a JSON object."); } $this->parsedBody = $parsedBody; return; } $this->parsedBody = (object) []; } public function getCookieParam(string $name): ?string { $params = $this->request->getCookieParams(); return $params[$name] ?? null; } /** * @return mixed */ public function getServerParam(string $name) { $params = $this->request->getServerParams(); return $params[$name] ?? null; } public function getUri(): UriInterface { return $this->request->getUri(); } public function getResourcePath(): string { $path = $this->request->getUri()->getPath(); return substr($path, strlen($this->basePath)); } public function isGet(): bool { return $this->getMethod() === 'GET'; } public function isPut(): bool { return $this->getMethod() === 'PUT'; } public function isUpdate(): bool { return $this->getMethod() === 'UPDATE'; } public function isPost(): bool { return $this->getMethod() === 'POST'; } public function isPatch(): bool { return $this->getMethod() === 'PATCH'; } public function isDelete(): bool { return $this->getMethod() === 'DELETE'; } }