IncomingRequest 类

IncomingRequest 类提供了一个面向对象的表示,用于表示来自客户端(如浏览器)的 HTTP 请求。它继承自 RequestMessage 类,并可以访问这两个类中的所有方法,此外还包括以下列出的方法。

访问请求

如果您当前的类是 CodeIgniter\Controller 的子类,则会为您预先填充一个请求类的实例,您可以将其作为类属性访问。

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class UserController extends Controller
{
    public function index()
    {
        if ($this->request->isAJAX()) {
            // ...
        }
    }
}

如果您不在控制器中,但仍然需要访问应用程序的请求对象,您可以通过 服务类 获取它的副本。

<?php

$request = \Config\Services::request();

但是,如果该类不是控制器,最好将请求作为依赖项传递,您可以在其中将其保存为类属性。

<?php

namespace App\Libraries;

use CodeIgniter\HTTP\RequestInterface;

class SomeClass
{
    protected $request;

    public function __construct(RequestInterface $request)
    {
        $this->request = $request;
    }
}

$someClass = new SomeClass(\Config\Services::request());

确定请求类型

请求可能有多种类型,包括 AJAX 请求或来自命令行的请求。可以使用 isAJAX()isCLI() 方法检查这一点。

<?php

// Check for AJAX request.
if ($request->isAJAX()) {
    // ...
}

// Check for CLI Request
if ($request->isCLI()) {
    // ...
}

注意

isAJAX() 方法依赖于 X-Requested-With 标头,在某些情况下,它不会在通过 JavaScript(即 fetch)的 XHR 请求中默认发送。有关如何避免此问题的详细信息,请参阅 AJAX 请求 部分。

is()

版本 4.3.0 中的新增功能。

从 v4.3.0 开始,您可以使用 is() 方法。它返回布尔值。

<?php

// Checks HTTP methods. Returns boolean.
$request->is('get');
$request->is('post');
$request->is('put');
$request->is('delete');
$request->is('head');
$request->is('patch');
$request->is('options');

// Checks if it is an AJAX request. The same as `$request->isAJAX()`.
$request->is('ajax');

// Checks if it is a JSON request.
$request->is('json');

getMethod()

您可以使用 getMethod() 方法检查此请求所代表的 HTTP 方法。

<?php

// Returns 'post'
$method = $request->getMethod();

默认情况下,该方法以小写字符串形式返回(例如,'get''post' 等)。

重要

将返回值转换为小写的功能已弃用。它将在未来的版本中删除,此方法将等效于 PSR-7。

您可以通过将调用包装在 strtoupper() 中来获取大写版本。

// Returns 'GET'
$method = strtoupper($request->getMethod());

您还可以使用 isSecure() 方法检查请求是否通过 HTTPS 连接发出。

<?php

if (! $request->isSecure()) {
    force_https();
}

检索输入

您可以通过 Request 对象从 $_GET$_POST$_COOKIE$_SERVER$_ENV 检索输入。数据不会自动过滤,并返回请求中传递的原始输入数据。

注意

使用全局变量是一种不好的做法。基本上,应该避免使用全局变量,建议使用 Request 对象的方法。

使用这些方法而不是直接访问它们 ($_POST['something']) 的主要优点是,如果项目不存在,它们将返回 null,并且您可以对数据进行过滤。这使您可以方便地使用数据,而无需先测试项目是否存在。换句话说,通常您可能会执行以下操作

<?php

$something = $_POST['foo'] ?? null;

使用 CodeIgniter 的内置方法,您可以简单地执行以下操作

<?php

$something = $request->getPost('foo');

获取数据

getGet()

getGet() 方法将从 $_GET 中提取数据。

  • $request->getGet()

getPost()

getPost() 方法将从 $_POST 中提取数据。

  • $request->getPost()

getCookie()

getCookie() 方法将从 $_COOKIE 中提取数据。

  • $request->getCookie()

getServer()

getServer() 方法将从 $_SERVER 中获取数据。

  • $request->getServer()

getEnv()

自版本 4.4.4 起已弃用: 此方法从一开始就不起作用。请使用 env() 代替。

getEnv() 方法将从 $_ENV 中获取数据。

  • $request->getEnv()

getPostGet()

此外,还有一些实用方法用于从 $_GET$_POST 中检索信息,同时保留控制查找顺序的能力。

  • $request->getPostGet() - 首先检查 $_POST,然后检查 $_GET

getGetPost()

  • $request->getGetPost() - 首先检查 $_GET,然后检查 $_POST

getVar()

重要

此方法仅为了向后兼容而存在。在新项目中不要使用它。即使您已经在使用它,我们也建议您使用其他更合适的方法。

getVar() 方法将从 $_REQUEST 中获取数据,因此将返回来自 $_GET$POST$_COOKIE 的任何数据(取决于 php.ini request-order)。

警告

如果您只想验证 POST 数据,请不要使用 getVar()。较新的值会覆盖较旧的值。如果 POST 值与 cookie 的名称相同,并且您在 request-order 中将“C”放在“P”之后,则 POST 值可能会被 cookie 覆盖。

注意

如果传入请求的 Content-Type 标头设置为 application/json,则 getVar() 方法将返回 JSON 数据,而不是 $_REQUEST 数据。

获取 JSON 数据

您可以使用 getJSON() 获取 php://input 的内容作为 JSON 流。

注意

此方法无法检查传入数据是否为有效的 JSON,您应该只在知道您期望 JSON 时使用此方法。

<?php

$json = $request->getJSON();

默认情况下,这将返回 JSON 数据中的任何对象作为对象。如果您希望将其转换为关联数组,请将 true 作为第一个参数传递。

第二个和第三个参数与 json_decode() PHP 函数的 $depth$flags 参数匹配。

从 JSON 获取特定数据

您可以通过将变量名传递到 getJsonVar() 中来获取 JSON 流中的特定数据,或者您可以使用“点”符号来深入 JSON 以获取不在根级别的​​数据。

<?php

/*
 * With a request body of:
 * {
 *     "foo": "bar",
 *     "fizz": {
 *         "buzz": "baz"
 *     }
 * }
 */

$data = $request->getJsonVar('foo');
// $data = "bar"

$data = $request->getJsonVar('fizz.buzz');
// $data = "baz"

如果您希望结果为关联数组而不是对象,则可以在第二个参数中传递 true

<?php

// With the same request as above
$data = $request->getJsonVar('fizz');
// $data->buzz = "baz"

$data = $request->getJsonVar('fizz', true);
// $data = ["buzz" => "baz"]

注意

有关“点”符号的更多信息,请参阅 dot_array_search()Array 助手中的文档。

获取原始数据 (PUT, PATCH, DELETE)

最后,您可以使用 getRawInput() 获取 php://input 的内容作为原始流。

<?php

$data = $request->getRawInput();

这将检索数据并将其转换为数组。像这样

<?php

var_dump($request->getRawInput());

/*
 * Outputs:
 * [
 *     'Param1' => 'Value1',
 *     'Param2' => 'Value2',
 * ]
 */

您也可以使用 getRawInputVar() 从原始流中获取指定变量并对其进行过滤。

<?php

// When the request body is 'foo=one&bar=two&baz[]=10&baz[]=20'
var_dump($request->getRawInputVar('bar'));
// Outputs: two

// foo=one&bar=two&baz[]=10&baz[]=20
var_dump($request->getRawInputVar(['foo', 'bar']));
/*
 * Outputs:
 * [
 *      'foo' => 'one',
 *      'bar' => 'two'
 * ]
 */

// foo=one&bar=two&baz[]=10&baz[]=20
var_dump($request->getRawInputVar('baz'));
/*
 * Outputs:
 * [
 *      '10',
 *      '20'
 * ]
 */

// foo=one&bar=two&baz[]=10&baz[]=20
var_dump($request->getRawInputVar('baz.0'));
// Outputs: 10

过滤输入数据

为了维护应用程序的安全性,您需要在访问所有输入时对其进行过滤。您可以将要使用的过滤器类型作为这些方法的第二个参数传递。本机 filter_var() 函数用于过滤。请查看 PHP 手册以获取 有效过滤器类型 的列表。

过滤 POST 变量将如下所示

<?php

$email = $request->getPost('email', FILTER_SANITIZE_EMAIL);

上面提到的所有方法都支持作为第二个参数传递的过滤器类型,除了 getJSON()getRawInput()

获取标头

您可以使用 headers() 方法访问与请求一起发送的任何标头,该方法返回所有标头的数组,其中键是标头的名称,值是 CodeIgniter\HTTP\Header 的实例。

<?php

var_dump($request->headers());

/*
 * Outputs:
 * [
 *     'Host'          => CodeIgniter\HTTP\Header,
 *     'Cache-Control' => CodeIgniter\HTTP\Header,
 *     'Accept'        => CodeIgniter\HTTP\Header,
 * ]
 */

如果您只需要单个标头,可以将名称传递给 header() 方法。这将以不区分大小写的方式获取指定的标头对象(如果存在)。如果不存在,则返回 null

<?php

// these are all equivalent
$host = $request->header('host');
$host = $request->header('Host');
$host = $request->header('HOST');

您始终可以使用 hasHeader() 来查看标头是否在本次请求中存在。

<?php

if ($request->hasHeader('DNT')) {
    // Don't track something...
}

如果您需要将标头的值作为字符串(所有值都在一行上),可以使用 getHeaderLine() 方法。

<?php

// Accept-Encoding: gzip, deflate, sdch
echo 'Accept-Encoding: ' . $request->getHeaderLine('accept-encoding');

如果您需要整个标头(包括名称和值在一个字符串中),只需将标头强制转换为字符串即可。

<?php

echo (string) $header;

请求 URL

您可以通过 $request->getUri() 方法获取一个表示当前请求 URI 的 URI 对象。您可以将此对象转换为字符串以获取当前请求的完整 URL。

<?php

$uri = (string) $request->getUri();

该对象使您能够完全获取请求的任何部分。

<?php

$uri = $request->getUri();

echo $uri->getScheme();         // http
echo $uri->getAuthority();      // snoopy:[email protected]:88
echo $uri->getUserInfo();       // snoopy:password
echo $uri->getHost();           // example.com
echo $uri->getPort();           // 88
echo $uri->getPath();           // /path/to/page
echo $uri->getRoutePath();      // path/to/page
echo $uri->getQuery();          // foo=bar&bar=baz
print_r($uri->getSegments());   // Array ( [0] => path [1] => to [2] => page )
echo $uri->getSegment(1);       // path
echo $uri->getTotalSegments();  // 3

您可以使用 getRoutePath() 来处理当前 URI 字符串(相对于您的 baseURL 的路径)。

注意

getRoutePath() 方法可用于 v4.4.0 及更高版本。在 v4.4.0 之前,getPath() 方法返回相对于您的 baseURL 的路径。

上传的文件

有关所有上传文件的信息可以通过 $request->getFiles() 获取,该方法返回一个 CodeIgniter\HTTP\Files\UploadedFile 实例数组。这有助于简化上传文件的工作,并使用最佳实践来最大程度地降低任何安全风险。

<?php

$files = $request->getFiles();

有关详细信息,请参阅 使用上传的文件

您可以根据 HTML 文件输入中给出的文件名,检索单独上传的文件。

<?php

$file = $request->getFile('userfile');

您可以根据 HTML 文件输入中给出的文件名,检索作为多文件上传的一部分上传的相同名称文件的数组。

<?php

$files = $request->getFileMultiple('userfile');

注意

此处的文件对应于 $_FILES。即使用户只点击表单的提交按钮而不上传任何文件,该文件仍然存在。您可以通过 UploadedFile 中的 isValid() 方法检查文件是否确实已上传。有关更多详细信息,请参阅 验证文件

内容协商

您可以通过 negotiate() 方法轻松地与请求协商内容类型。

<?php

$language    = $request->negotiate('language', ['en-US', 'en-GB', 'fr', 'es-mx']);
$imageType   = $request->negotiate('media', ['image/png', 'image/jpg']);
$charset     = $request->negotiate('charset', ['UTF-8', 'UTF-16']);
$contentType = $request->negotiate('media', ['text/html', 'text/xml']);
$encoding    = $request->negotiate('encoding', ['gzip', 'compress']);

有关更多详细信息,请参阅 内容协商 页面。

类参考

注意

除了此处列出的方法之外,此类还继承了来自 Request 类Message 类 的方法。

父类提供的可用方法是

  • CodeIgniter\HTTP\Request::getIPAddress()

  • CodeIgniter\HTTP\Request::isValidIP()

  • CodeIgniter\HTTP\Request::getMethod()

  • CodeIgniter\HTTP\Request::setMethod()

  • CodeIgniter\HTTP\Request::getServer()

  • CodeIgniter\HTTP\Request::getEnv()

  • CodeIgniter\HTTP\Request::setGlobal()

  • CodeIgniter\HTTP\Request::fetchGlobal()

  • CodeIgniter\HTTP\Message::getBody()

  • CodeIgniter\HTTP\Message::setBody()

  • CodeIgniter\HTTP\Message::appendBody()

  • CodeIgniter\HTTP\Message::populateHeaders()

  • CodeIgniter\HTTP\Message::headers()

  • CodeIgniter\HTTP\Message::header()

  • CodeIgniter\HTTP\Message::hasHeader()

  • CodeIgniter\HTTP\Message::getHeaderLine()

  • CodeIgniter\HTTP\Message::setHeader()

  • CodeIgniter\HTTP\Message::removeHeader()

  • CodeIgniter\HTTP\Message::appendHeader()

  • CodeIgniter\HTTP\Message::prependHeader()

  • CodeIgniter\HTTP\Message::getProtocolVersion()

  • CodeIgniter\HTTP\Message::setProtocolVersion()

class CodeIgniter\HTTP\IncomingRequest
isCLI()
返回:

如果请求来自命令行,则为 True,否则为 False。

返回类型:

bool

isAJAX()
返回:

如果请求是 AJAX 请求,则为 True,否则为 False。

返回类型:

bool

isSecure()
返回:

如果请求是 HTTPS 请求,则为 True,否则为 False。

返回类型:

bool

getVar([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) – 要查找的变量/键的名称。

  • $filter (int) – 要应用的过滤器类型。可以在 过滤器类型 中找到过滤器列表。

  • $flags (int) – 要应用的标志。可以在 过滤器标志 中找到标志列表。

返回:

如果未提供参数,则为 $_REQUEST,否则为找到的 REQUEST 值,如果未找到,则为 null

返回类型:

数组|布尔值|浮点数|整数|对象|字符串|空值

重要

此方法仅为了向后兼容而存在。在新项目中不要使用它。即使您已经在使用它,我们也建议您使用其他更合适的方法。

此方法与 getGet() 相同,只是它获取 REQUEST 数据。

getGet([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) – 要查找的变量/键的名称。

  • $filter (int) – 要应用的过滤器类型。可以在 过滤器类型 中找到过滤器列表。

  • $flags (int) – 要应用的标志。可以在 过滤器标志 中找到标志列表。

返回:

$_GET 如果没有提供参数,否则为找到的 GET 值,如果未找到则为 null

返回类型:

数组|布尔值|浮点数|整数|对象|字符串|空值

第一个参数将包含您要查找的 GET 项目的名称

<?php

$request->getGet('some_data');

如果要检索的项目不存在,则该方法返回 null。

第二个可选参数允许您将数据通过 PHP 的过滤器运行。将所需的过滤器类型作为第二个参数传递

<?php

$request->getGet('some_data', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

要返回所有 GET 项目的数组,请在不带任何参数的情况下调用。

要返回所有 GET 项目并将它们通过过滤器传递,请将第一个参数设置为 null,同时将第二个参数设置为要使用的过滤器

<?php

$request->getGet(null, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// returns all GET items with string sanitation

要返回多个 GET 参数的数组,请将所有必需的键作为数组传递

<?php

$request->getGet(['field1', 'field2']);

这里也适用相同的规则,要检索带有过滤器的参数,请将第二个参数设置为要应用的过滤器类型

<?php

$request->getGet(['field1', 'field2'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
getPost([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) – 要查找的变量/键的名称。

  • $filter (int) – 要应用的过滤器类型。可以在 此处找到过滤器列表。

  • $flags (int) – 应用的标志。可以在 这里 找到标志列表。

返回:

如果没有提供参数,则为 $_POST,否则为找到的 POST 值,如果未找到则为 null

返回类型:

数组|布尔值|浮点数|整数|对象|字符串|空值

此方法与 getGet() 相同,只是它获取 POST 数据。

getPostGet([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) – 要查找的变量/键的名称。

  • $filter (int) – 要应用的过滤器类型。可以在 过滤器类型 中找到过滤器列表。

  • $flags (int) – 要应用的标志。可以在 过滤器标志 中找到标志列表。

返回:

如果没有指定参数,则将 $_POST$_GET 组合在一起(在冲突时优先使用 POST 值),否则会查找 POST 值,如果未找到,则会查找 GET 值,如果未找到任何值,则返回 null

返回类型:

数组|布尔值|浮点数|整数|对象|字符串|空值

此方法的工作方式与 getPost()getGet() 非常相似,只是组合在一起。它将在 POST 和 GET 流中搜索数据,首先在 POST 中查找,然后在 GET 中查找

<?php

$request->getPostGet('field1');

如果没有指定索引,它将返回组合的 POST 和 GET 流。尽管在出现名称冲突的情况下,POST 数据将被优先考虑。

getGetPost([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) – 要查找的变量/键的名称。

  • $filter (int) – 要应用的过滤器类型。可以在 过滤器类型 中找到过滤器列表。

  • $flags (int) – 要应用的标志。可以在 过滤器标志 中找到标志列表。

返回:

如果没有指定参数,则将 $_GET$_POST 组合在一起(在冲突时优先使用 GET 值),否则会查找 GET 值,如果未找到,则会查找 POST 值,如果未找到任何值,则返回 null

返回类型:

数组|布尔值|浮点数|整数|对象|字符串|空值

此方法的工作方式与 getPost()getGet() 非常相似,只是组合在一起。它将在 GET 和 POST 流中搜索数据,首先在 GET 中查找,然后在 POST 中查找

<?php

$request->getGetPost('field1');

如果没有指定索引,它将返回组合的 GET 和 POST 流。尽管在出现名称冲突的情况下,GET 数据将被优先考虑。

getCookie([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (array|string|null) – COOKIE 名称

  • $filter (int) – 要应用的过滤器类型。可以在 过滤器类型 中找到过滤器列表。

  • $flags (int) – 要应用的标志。可以在 过滤器标志 中找到标志列表。

返回:

如果未提供参数,则为 $_COOKIE,否则为找到的 COOKIE 值,如果未找到则为 null

返回类型:

数组|布尔值|浮点数|整数|对象|字符串|空值

此方法与 getPost()getGet() 相同,只是它获取 cookie 数据

<?php

$request->getCookie('some_cookie');
$request->getCookie('some_cookie', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // with filter

要返回多个 cookie 值的数组,请将所有必需的键作为数组传递

<?php

$request->getCookie(['some_cookie', 'some_cookie2']);

注意

Cookie 助手 函数 get_cookie() 不同,此方法不会在前面添加您配置的 Config\Cookie::$prefix 值。

getServer([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (array|string|null) – 值名称

  • $filter (int) – 要应用的过滤器类型。可以在 过滤器类型 中找到过滤器列表。

  • $flags (int) – 要应用的标志。可以在 过滤器标志 中找到标志列表。

返回:

如果找到,则为 $_SERVER 项目值,如果未找到,则为 null

返回类型:

数组|布尔值|浮点数|整数|对象|字符串|空值

此方法与 getPost()getGet()getCookie() 方法相同,只是它获取服务器数据 ($_SERVER)

<?php

$request->getServer('some_data');

要返回多个 $_SERVER 值的数组,请将所有必需的键作为数组传递。

<?php

$request->getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
getUserAgent()
返回:

用户代理字符串,如 SERVER 数据中找到的,如果未找到则为 null。

返回类型:

CodeIgniter\HTTP\UserAgent

此方法从 SERVER 数据返回用户代理实例

<?php

$request->getUserAgent();
getPath()
返回:

相对于 baseURL 的当前 URI 路径

返回类型:

字符串

此方法返回相对于 baseURL 的当前 URI 路径。

注意

在 v4.4.0 之前,这是确定“当前 URI”的最安全方法,因为 IncomingRequest::$uri 可能无法感知到完整的 App 配置,包括基本 URL。

setPath($path)

自版本 4.4.0 起已弃用。

参数:
  • $path (string) – 用作当前 URI 的相对路径

返回:

此传入请求

返回类型:

传入请求

注意

在 v4.4.0 之前,主要用于测试目的,它允许您为当前请求设置相对路径值,而不是依赖于 URI 检测。这也使用新的路径更新了底层的 URI 实例。