请求

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_IPHTTP_X_FORWARDED_FORHTTP_X_FORWARDEDHTTP_X_CLUSTER_CLIENT_IPHTTP_FORWARDED_FORHTTP_FORWARDED
  • host - 请求主机名
  • servername - 来自 $_SERVER 的 SERVER_NAME

您可以将 querydatacookiesfiles 属性作为数组或对象访问。

因此,要获取查询字符串参数,您可以这样做:

$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'];

您可以通过 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']