请求与响应
// 请求(Mtphp\Http\Request)
$request->method(); // GET/POST/...
$request->path(); // 已对百分号编码解码(中文路径安全)
$request->query('page', 1); // GET 参数,带默认值
$request->post('name'); // POST 参数
$request->input('mix'); // 统一取参:post > query > json
$request->json(); // 解析 application/json 请求体
$request->header('x-token');
$request->isAjax();
// 响应(Mtphp\Http\Response)
return response($html); // HTML
return response()->json(['ok' => true]); // JSON(自动转义 UTF-8)
return response()->status(201)->json($data); // 自定义状态码
return (new Response($body, 404))->header('X-A','1');// 底层响应对象
框架统一以 response->send() 一次性输出(OPcache 友好)。JSON 输出使用 JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_IGNORE,可容忍部分扩展的 GBK 错误消息。
8.1 文件上传(UploadedFile)
框架内置零依赖的上传封装(Mtphp\Http\UploadedFile,思想借鉴主流框架、独立实现),控制器里直接从请求取文件即可,不依赖任何扩展。
// 助手 request() 惰性捕获当前请求;或直接在路由闭包 / 控制器用 $request 参数
$file = request()->file('avatar'); // 单文件:返回 UploadedFile 或 null
$files = request()->files('images'); // 多文件:返回 UploadedFile 数组;无参返回全部
if ($file !== null && $file->isValid()) {
// 白名单 + 大小校验(扩展名小写;maxSizeBytes=0 不限制大小)
if (!$file->validate(['jpg', 'png'], 2 * 1024 * 1024)) {
return response()->json(['error' => '文件类型或大小不合规'], 422);
}
// 移动到目标目录(不存在自动创建;文件名自动 basename 防穿越);返回完整路径
$path = $file->move('uploads/avatar', uniqid() . '.' . $file->getExtension());
}
// UploadedFile 常用 API
$file->getClientOriginalName(); // 客户端原始名
$file->getExtension(); // 小写扩展名
$file->getSize(); // 字节数
$file->getClientMimeType(); // 客户端声明 MIME
$file->getMimeType(); // 真实 MIME(finfo 探测,失败回退声明)
$file->hashName(); // 基于内容 hash + 扩展名
$file->isValid(); // error=0 且文件存在
要点:
Request::files($key)把 PHP$_FILES规范化为UploadedFile树:单文件为UploadedFile,多文件(<input name="images[]">)为该字段下的UploadedFile数组;嵌套字段名(如group[avatar])同样支持。Swoole 场景可用$request->setFiles($files)注入。move()兼容标准上传(move_uploaded_file)与非标准上传源(如 Swoole 临时文件,自动rename/copy),因此既能在真实请求中移动,也便于测试。- 文件落盘建议放在
runtime/或专用存储目录并做好访问权限控制;对外访问需经控制器授权,避免直接暴露上传目录。