_datas = array_merge($_GET, $_POST, $params); $this->_files = $_FILES ?? []; $this->_server = $_SERVER ?? []; $this->baseUrl = $this->detectBaseUrl(); $this->uri = $this->detectUri(); } // -------------------- // 요청 데이터 관련 // -------------------- public function all(): array { return $this->_datas; } public function get(?string $key = null, $default = null): mixed { if ($key === null) { return $this->all(); } return $this->_datas[$key] ?? $default; } public function only(array $keys): array { return array_intersect_key($this->_datas, array_flip($keys)); } public function has(string $key): bool { return array_key_exists($key, $this->_datas); } public function file(string $key): mixed { return $this->_files[$key] ?? null; } public function method(): string { return strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET'); } public function isPost(): bool { return $this->method() === 'POST'; } public function isGet(): bool { return $this->method() === 'GET'; } // -------------------- // URL/경로 관련 // -------------------- public function baseUrl(): string { return $this->baseUrl; } public function currentUrl(): string { return $this->baseUrl . '/' . ltrim($this->uri, '/'); } public function previousUrl(): ?string { return $_SESSION['_previous_url'] ?? null; } public function segments(): array { return explode('/', trim($this->uri, '/')); } public function segment(int $n): ?string { $segments = $this->segments(); return $segments[$n - 1] ?? null; } public function urlIs(string $pattern): bool { $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $pattern = str_replace('*', '.*', preg_quote($pattern, '/')); return preg_match("/^{$pattern}$/", $uri) === 1; } public function to(string $path): string { return rtrim($this->baseUrl, '/') . '/' . ltrim($path, '/'); } // 현재 URI 반환 (도메인 제외) public function path(): string { return $this->uri; } // -------------------- // 내부 URL 추출 로직 // -------------------- protected function detectUri(): string { $uri = $_SERVER['REQUEST_URI'] ?? '/'; $scriptName = dirname($_SERVER['SCRIPT_NAME'] ?? ''); $uri = str_replace($scriptName, '', $uri); $uri = strtok($uri, '?'); // 쿼리 스트링 제거 return $uri; } protected function detectBaseUrl(): string { $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST'] ?? 'localhost'; $scriptDir = rtrim(dirname($_SERVER['SCRIPT_NAME'] ?? ''), '/'); return $scheme . '://' . $host . $scriptDir; } // -------------------- // Validator 연동 // -------------------- public function validate(array $rules, array $messages = []): bool|array { $validator = new Validator(); $validator->setData($this->all())->setRules($rules)->setMessages($messages); if (!$validator->run()) { return $validator->errors(); } return true; } }