Flight注册路由用Flight::route(),返回JSON需调用Flight::json()(自动设header和状态码)或手动header()+echo;POST取JSON体用file_get_contents('php://input'),表单数据直接用$_POST;RESTful需正则匹配路径并判断请求方法;404或空白页多因重写规则未生效或PHP版本过低。

Flight框架怎么注册路由并返回JSON
Flight本身不内置JSON自动序列化,json_encode() 得手动调用,否则返回纯字符串或触发header冲突。常见错误是直接echo json_encode($data)但没设Content-Type: application/json,前端收到文本却当JSON解析失败。
正确做法是先调用Flight::json()(它内部已处理header和输出),或者自己用header() + echo组合:
Flight::route('GET /api/users', function() {
$users = [['id' => 1, 'name' => 'Alice']];
Flight::json($users); // ✅ 推荐:一行搞定
// 或手动:
// header('Content-Type: application/json');
// echo json_encode($users);
});-
Flight::json()会自动发送200 OK状态码,若需自定义状态(如404),得先调用Flight::response()->status(404) - 不要在路由回调里用
return——Flight不捕获返回值,写了也无效 - 如果数据含中文,确保PHP文件保存为UTF-8无BOM,否则
json_encode()可能返回null
POST请求怎么取原始JSON体或表单数据
Flight默认不解析application/json请求体,$_POST为空;而application/x-www-form-urlencoded才进$_POST。很多人卡在这儿,以为框架“收不到POST”。
区分两种情况处理:
立即学习“PHP免费学习笔记(深入)”;
// 处理 JSON POST
Flight::route('POST /api/users', function() {
$input = json_decode(file_get_contents('php://input'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
Flight::halt(400, 'Invalid JSON');
}
// $input 现在是关联数组
});
<p>// 处理表单 POST(自动进 $_POST)
Flight::route('POST /api/users/form', function() {
$name = $_POST['name'] ?? null;
$email = $_POST['email'] ?? null;
});- 别依赖
$_REQUEST——它不包含php://input内容 - 用
file_get_contents('php://input')只读一次,多次调用会返回空 - 如果前端发的是
multipart/form-data(带文件),仍走$_POST和$_FILES,无需php://input
怎么让Flight支持RESTful风格的URL和方法
Flight原生只认GET、POST、PUT、DELETE字面量,不自动把_method=PUT转成真实方法,也不支持/users/:id里的:id自动提取——得靠正则或手动解析。
要模拟RESTful路径,必须显式写正则匹配,并用Flight::request()->method判断真实HTTP方法:
Flight::route('GET|POST|PUT|DELETE /api/users/@id', function($id) {
$method = Flight::request()->method;
switch ($method) {
case 'GET': return Flight::json(['id' => $id]); break;
case 'PUT': /* 更新逻辑 */ break;
case 'DELETE':/* 删除逻辑 */ break;
}
});-
@id是Flight的占位符语法,会被自动传入回调参数,但不会做类型转换($id始终是字符串) - 如果前端用
fetch发PUT,需确保服务器允许该方法(Apache/Nginx配置、.htaccess等) - 没有内置的
resource快捷注册,每个动词+路径都要单独route()
为什么本地跑正常,上线后404或空白页
Flight依赖.htaccess重写把所有请求导向index.php,但很多共享主机或Nginx环境默认没开重写,或规则写错。
Apache下确认.htaccess存在且生效:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]- Nginx用户必须手动配置
try_files,不能指望.htaccess —— 常见坑是漏掉index.php后面的$args - 某些主机禁用
mod_rewrite,只能改用PATH_INFO方式:访问index.php/users而非/users - 如果页面空白且无报错,检查
display_errors是否关闭,先在index.php开头加ini_set('display_errors', 1)定位问题
真正麻烦的不是写30行代码,而是部署时那个没生效的重写规则,或者PHP版本低于5.4(Flight 1.x最低要求),这些细节一漏,服务就静默失效。



















