feat(core): add HTTP request, response and route match value objects

This commit is contained in:
dualfroz committed 2026-08-23 13:43:38 +02:00
1 parent bcd3572890
commit 9a729f1609
3 files changed
+158

No files matched your search

+79
View File
@@ -0,0 +1,79 @@
<?php
namespace Bazaar\Core;
final class Request
{
public function __construct(
private readonly string $method,
private readonly string $path,
private readonly array $query,
private readonly array $body,
private readonly array $server
) {
}
public static function capture(): Request
{
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$path = parse_url($uri, PHP_URL_PATH) ?: '/';
$path = '/' . trim(rawurldecode($path), '/');
if ($path === '/') {
$path = '/';
}
return new self(
strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET'),
$path,
$_GET,
$_POST,
$_SERVER
);
}
public function method(): string
{
return $this->method;
}
public function path(): string
{
return $this->path;
}
public function isPost(): bool
{
return $this->method === 'POST';
}
public function query(string $key, mixed $default = null): mixed
{
return $this->query[$key] ?? $default;
}
public function input(string $key, mixed $default = null): mixed
{
return $this->body[$key] ?? $default;
}
public function integer(string $key, int $default = 0): int
{
$value = $this->body[$key] ?? $this->query[$key] ?? $default;
return is_numeric($value) ? (int) $value : $default;
}
public function body(): array
{
return $this->body;
}
public function header(string $name): ?string
{
$key = 'HTTP_' . strtoupper(str_replace('-', '_', $name));
return $this->server[$key] ?? null;
}
public function rawBody(): string
{
return file_get_contents('php://input') ?: '';
}
}
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace Bazaar\Core;
final class Response
{
private array $headers = [];
public function __construct(
private string $content = '',
private int $status = 200
) {
}
public static function html(string $content, int $status = 200): Response
{
$response = new self($content, $status);
$response->headers['Content-Type'] = 'text/html; charset=UTF-8';
return $response;
}
public static function json(array $payload, int $status = 200): Response
{
$response = new self(json_encode($payload, JSON_UNESCAPED_SLASHES), $status);
$response->headers['Content-Type'] = 'application/json';
return $response;
}
public static function redirect(string $location, int $status = 302): Response
{
$response = new self('', $status);
$response->headers['Location'] = $location;
return $response;
}
public function withHeader(string $name, string $value): Response
{
$this->headers[$name] = $value;
return $this;
}
public function status(): int
{
return $this->status;
}
public function content(): string
{
return $this->content;
}
public function send(): void
{
http_response_code($this->status);
foreach ($this->headers as $name => $value) {
header($name . ': ' . $value);
}
echo $this->content;
}
}
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace Bazaar\Core;
final class RouteMatch
{
public function __construct(
public readonly ?array $handler,
public readonly array $params,
public readonly array $middleware,
public readonly int $status
) {
}
public function found(): bool
{
return $this->status === 200 && $this->handler !== null;
}
}