请求
Flight 将 HTTP 请求封装成一个单一对象,可以通过以下方式访问:
$request = Flight::request();
典型用例
在 Web 应用程序中处理请求时,通常您希望提取一个头部,或是 $_GET
或 $_POST
参数,甚至是原始请求体。Flight 提供了一个简单的接口来完成这些操作。
这是一个获取查询字符串参数的示例:
Flight::route('/search', function(){
$keyword = Flight::request()->query['keyword'];
echo "您正在搜索: $keyword";
// 查询数据库或其他内容使用 $keyword
});
这是一个可能使用 POST 方法的表单示例:
Flight::route('POST /submit', function(){
$name = Flight::request()->data['name'];
$email = Flight::request()->data['email'];
echo "您提交了: $name, $email";
// 保存到数据库或其他内容使用 $name 和 $email
});
请求对象属性
请求对象提供了以下属性:
- body - 原始 HTTP 请求体
- url - 被请求的 URL
- base - URL 的父子目录
- method - 请求方法 (GET, POST, PUT, DELETE)
- referrer - 引荐 URL
- ip - 客户端 IP 地址
- ajax - 请求是否为 AJAX 请求
- scheme - 服务器协议 (http, https)
- user_agent - 浏览器信息
- type - 内容类型
- length - 内容长度
- query - 查询字符串参数
- data - POST 数据或 JSON 数据
- cookies - Cookie 数据
- files - 上传的文件
- secure - 连接是否安全
- accept - HTTP 接受参数
- proxy_ip - 客户端的代理 IP 地址。按顺序扫描
$_SERVER
数组中的HTTP_CLIENT_IP
、HTTP_X_FORWARDED_FOR
、HTTP_X_FORWARDED
、HTTP_X_CLUSTER_CLIENT_IP
、HTTP_FORWARDED_FOR
、HTTP_FORWARDED
。 - host - 请求主机名
- servername - 来自
$_SERVER
的 SERVER_NAME
您可以将 query
、data
、cookies
和 files
属性作为数组或对象访问。
因此,要获取查询字符串参数,您可以这样做:
$id = Flight::request()->query['id'];
或者:
$id = Flight::request()->query->id;
原始请求体
要获取原始 HTTP 请求体,例如在处理 PUT 请求时,您可以这样做:
$body = Flight::request()->getBody();
JSON 输入
如果您发送一个类型为 application/json
的请求,且数据为 {"id": 123}
,它将从 data
属性中可用:
$id = Flight::request()->data->id;
$_GET
您可以通过 query
属性访问 $_GET
数组:
$id = Flight::request()->query['id'];
$_POST
您可以通过 data
属性访问 $_POST
数组:
$id = Flight::request()->data['id'];
$_COOKIE
您可以通过 cookies
属性访问 $_COOKIE
数组:
$myCookieValue = Flight::request()->cookies['myCookieName'];
$_SERVER
有一个快捷方式通过 getVar()
方法访问 $_SERVER
数组:
$host = Flight::request()->getVar('HTTP_HOST');
通过 $_FILES 访问上传的文件
您可以通过 files
属性访问上传的文件:
$uploadedFile = Flight::request()->files['myFile'];
处理文件上传 (v3.12.0)
您可以使用框架的辅助方法处理文件上传。这基本上涉及从请求中提取文件数据,并将其移动到新位置。
Flight::route('POST /upload', function(){
// 如果有一个输入字段如 <input type="file" name="myFile">
$uploadedFileData = Flight::request()->getUploadedFiles();
$uploadedFile = $uploadedFileData['myFile'];
$uploadedFile->moveTo('/path/to/uploads/' . $uploadedFile->getClientFilename());
});
如果有多个文件上传,您可以遍历它们:
Flight::route('POST /upload', function(){
// 如果有一个输入字段如 <input type="file" name="myFiles[]">
$uploadedFiles = Flight::request()->getUploadedFiles()['myFiles'];
foreach ($uploadedFiles as $uploadedFile) {
$uploadedFile->moveTo('/path/to/uploads/' . $uploadedFile->getClientFilename());
}
});
安全注意: 始终验证和清理用户输入,尤其是处理文件上传时。始终验证允许上传的文件扩展类型,但您还应该验证文件的“魔术字节”以确保它是用户声称的文件类型。有 articles and libraries 可用来帮助处理这个问题。
请求头部
您可以使用 getHeader()
或 getHeaders()
方法访问请求头部:
// 也许您需要 Authorization 头部
$host = Flight::request()->getHeader('Authorization');
// 或
$host = Flight::request()->header('Authorization');
// 如果您需要获取所有头部
$headers = Flight::request()->getHeaders();
// 或
$headers = Flight::request()->headers();
请求体
您可以使用 getBody()
方法访问原始请求体:
$body = Flight::request()->getBody();
请求方法
您可以使用 method
属性或 getMethod()
方法访问请求方法:
$method = Flight::request()->method; // 实际上调用 getMethod()
$method = Flight::request()->getMethod();
注意: getMethod()
方法首先从 $_SERVER['REQUEST_METHOD']
中获取方法,然后如果存在的话,它可以被 $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']
或 $_REQUEST['_method']
覆盖。
请求 URL
有一些辅助方法可以方便地组合 URL 部分。
完整 URL
您可以使用 getFullUrl()
方法访问完整的请求 URL:
$url = Flight::request()->getFullUrl();
// https://example.com/some/path?foo=bar
基础 URL
您可以使用 getBaseUrl()
方法访问基础 URL:
$url = Flight::request()->getBaseUrl();
// 注意,没有尾部斜杠。
// https://example.com
查询解析
您可以将 URL 传递给 parseQuery()
方法,将查询字符串解析成关联数组:
$query = Flight::request()->parseQuery('https://example.com/some/path?foo=bar');
// ['foo' => 'bar']