You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:03:43