PHP框架开发:如何设置默认HTTP状态码及集成Response类
PHP 集成Response类实现HTTP状态码返回方案
1. 完善Response类,支持状态码控制
先把Response类改成能灵活设置状态码、发送标准HTTP响应的结构,默认状态码设为200,同时支持404、405、500等常用状态码:
<?php class Response { // 定义常用HTTP状态码与对应描述 private const STATUS_MAP = [ 200 => 'OK', 404 => 'Not Found', 405 => 'Method Not Allowed', 500 => 'Internal Server Error' ]; private int $statusCode; private array $headers = []; private mixed $responseContent; // 构造函数默认200状态码 public function __construct(int $statusCode = 200) { $this->setStatusCode($statusCode); } // 校验并设置状态码 public function setStatusCode(int $statusCode): void { if (!isset(self::STATUS_MAP[$statusCode])) { throw new InvalidArgumentException("无效的HTTP状态码: {$statusCode}"); } $this->statusCode = $statusCode; } // 添加响应头 public function addHeader(string $key, string $value): void { $this->headers[$key] = $value; } // 设置响应内容,自动识别JSON格式 public function setContent(mixed $content): void { if (is_array($content) || is_object($content)) { $this->addHeader('Content-Type', 'application/json'); $this->responseContent = json_encode($content); } else { $this->responseContent = (string)$content; } } // 发送完整HTTP响应 public function send(): void { // 发送状态行 header("HTTP/1.1 {$this->statusCode} " . self::STATUS_MAP[$this->statusCode]); // 发送响应头 foreach ($this->headers as $key => $value) { header("{$key}: {$value}"); } // 输出响应内容 echo $this->responseContent; exit; } }
2. 确定Response类的引入位置:Kernel.php的路由分发逻辑中
$app->run()只是应用的入口启动方法,负责初始化依赖(Request、Router、Kernel等)并启动处理流程,不适合直接处理响应细节。应该在Kernel.php的路由分发(dispatch)相关逻辑中引入Response类,因为Kernel是请求处理的核心层,负责路由匹配、请求校验、业务逻辑执行,最后生成响应,符合单一职责原则。
各文件修改示例
Kernel.php(核心处理逻辑)
<?php class Kernel { private Router $router; private Request $request; public function __construct(Router $router, Request $request) { $this->router = $router; $this->request = $request; } public function handle(): void { try { // 执行路由分发 $routeInfo = $this->router->dispatch($this->request); // 路由未匹配到,返回404 if (!$routeInfo) { $response = new Response(404); $response->setContent(['error' => '页面不存在']); $response->send(); } // 请求方法不允许,返回405 if (!in_array($this->request->getMethod(), $routeInfo['allowed_methods'])) { $response = new Response(405); $response->setContent(['error' => '请求方法不允许']); $response->send(); } // 执行业务逻辑,获取响应内容 [$controller, $method] = $routeInfo['handler']; $content = (new $controller())->$method($this->request); // 默认返回200响应 $response = new Response(); $response->setContent($content); $response->send(); } catch (Exception $e) { // 服务器内部错误,返回500 $response = new Response(500); $response->setContent(['error' => '服务器错误', 'msg' => $e->getMessage()]); $response->send(); } } }
index.php(入口文件)
保持简洁,只负责初始化依赖并启动Kernel处理:
<?php require_once 'Request.php'; require_once 'Router.php'; require_once 'Kernel.php'; require_once 'Response.php'; // 初始化请求、路由实例 $request = new Request(); $router = new Router(); // 示例路由注册 $router->get('/home', [HomeController::class, 'index']); // 启动应用核心处理 $kernel = new Kernel($router, $request); $kernel->handle();
3. 日常使用示例
在控制器或路由逻辑中,可按需指定状态码返回:
// 比如在控制器中返回自定义状态码 class HomeController { public function index(Request $request) { // 业务逻辑判断后,返回403状态码 if (!$request->hasAuth()) { $response = new Response(403); $response->setContent(['error' => '无访问权限']); $response->send(); } // 默认返回200 return ['data' => '首页内容']; } }
内容的提问来源于stack exchange,提问作者holdmydev
相关产品推荐
相关产品推荐

