IncomingRequest 类

IncomingRequest 类提供了一个客户端(比如 浏览器)HTTP 请求的面向对象封装。 基于它可以访问所有 RequestMessage 中的方法, 以及以下列出的方法。

获得请求

如果当前控制器继承了 CodeIgniter\Controller,则一个 Request 类的实例已被初始化并可作为属性被使用:

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

如果在控制器外使用 Request 对象,可以通过 Services class 获得实例:

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

推荐将 Request 对象作为一个依赖注入到当前类中并保存为一个属性:

use CodeIgniter\HTTP\RequestInterface;

class SomeClass
{
        protected $request;

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

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

判断请求类型

请求有多种来源,包含使用 AJAX 发起和使用 CLI 发起的。可通过 isAJAX() and isCLI() 来检测:

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

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

你可以检测请求的 HTTP 类型:

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

该方法默认返回类型是小写的字符串 (比如 'get', 'post' 等等),你可以通过传递 true 参数来获得大写的返回结果:

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

还可以通过 isSecure() 方法检测请求是否是 HTTPS:

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

数据读取

你可以通过 Request 对象读取 $_SERVER, $_GET, $_POST, $_ENV, $_SESSION 内的信息。 因为输入数据不会自动过滤,只会返回请求时的原始数据。而使用这些方法去替代直接获取数据的(比如 $_POST['something'])主要优点是当参数不存在时会返回 null ,而且你还能做数据过滤。这可以使你很方便的直接使用 数据而不需要先去判断某个参数是否存在。换句话说,一般情况下你以前会这么做:

$something = isset($_POST['foo']) ? $_POST['foo'] : NULL;

而使用 CodeIgniter 的内建方法你可以很简单的做到同样的事:

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

因为 getVar() 方法从 $_REQUEST 获得数据,所以使用它可以获得 $_GET, $POST, $_COOKIE 内的数据。虽然这很方便,但是你有时也需要使用一些特定的方法,比如:

  • $request->getGet()
  • $request->getPost()
  • $request->getServer()
  • $request->getCookie()

另外,还有一些实用的方法可以同时获取 $_GET 或者 $_POST 的数据,因为有获取顺序的问题,我们提供了以下方法:

  • $request->getPostGet() - 先 $_POST, 后 $_GET
  • $request->getGetPost() - 先 $_GET, 后 $_POST

获取 JSON 数据

你可以使用 getJSON() 去获取 php://input 传递的 JSON 格式的数据。

注解

因为无法检测来源数据是否具有有效的JSON格式,所以只有当你确认数据来源格式是JSON后才可使用。

$json = $request->getJSON();

默认情况下,这会返回一个 JSON 数据对象。如果你需要一个数据,请传递 true 作为第一个参数。

该方法的第二和第三个参数则分别对应 json_decode 方法的 depthoptions 参数.

获取原始数据(获取 Method 为 PUT, PATCH, DELETE 传递的数据)

最后,你可以通过 getRawInput() 去获取 php://input 传递的原始数据。

$data = $request->getRawInput();

这会返回数据并转换为数组。比如:

var_dump($request->getRawInput());

[
        'Param1' => 'Value1',
        'Param2' => 'Value2'
]

数据过滤

为了保证应用程序的安全,必须过滤所有输入的数据。你可以传递过滤类型到方法的最后一个参数里。会调用系统方法 filter_var() 去过滤。具体过滤类型可以参考 PHP 手册里的列表 valid filter types.

过滤一个 POST 变量可以这么做:

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

以上提到的方法中除了 getJSON()getRawInput() ,都支持给最后一个参数传递类型来实现过滤。

获取数据头

你可以通过 getHeaders() 方法获得请求的数据头,该方法会以数组形式返回所有的数据头信息,数据的键值为数据头名称,值则为一个 CodeIgniter\HTTP\Header 的实例:

var_dump($request->getHeaders());

[
        'Host' => CodeIgniter\HTTP\Header,
        'Cache-Control' => CodeIgniter\HTTP\Header,
        'Accept' => CodeIgniter\HTTP\Header,
]

如果你只是想获得某个头的信息,你可以将数据头名称作为参数传递给 getHeader() 方法。数据头名称无视大小写,如果存在则返回指定头信息。如果不存在则返回 null

// 以下这些效果一样
$host = $request->getHeader('host');
$host = $request->getHeader('Host');
$host = $request->getHeader('HOST');

你可以使用 hasHeader() 去判断请求头是否存在:

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

如果你需要某个头的值并在一行字符串内输出,可以使用 getHeaderLine() 方法:

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

如果你需要完整头信息,输出包括全部名称和值的字符串,可以使用如下方法做转换:

echo (string)$header;

请求地址

你可以通过访问 $request->uri 属性获取代表当前访问信息的 doc:URI <uri> 对象。通过以下方法获取当前请求的完整访问地址:

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

该对象赋予了你访问全部请求信息的能力:

$uri = $request->uri;

echo $uri->getScheme();         // http
echo $uri->getAuthority();      // snoopy:password@example.com:88
echo $uri->getUserInfo();       // snoopy:password
echo $uri->getHost();           // example.com
echo $uri->getPort();           // 88
echo $uri->getPath();           // /path/to/page
echo $uri->getQuery();          // foo=bar&bar=baz
echo $uri->getSegments();       // ['path', 'to', 'page']
echo $uri->getSegment(1);       // 'path'
echo $uri->getTotalSegments();  // 3

上传文件

所有上传文件的信息可以通过 $request->getFiles() 方法获得,该方法会返回一个 FileCollection 实例。这会有助于减少处理文件上传的工作量,以及使用最佳方案去降低安全风险。

$files = $request->getFiles();

// Grab the file by name given in HTML form
if ($files->hasFile('uploadedFile')
{
        $file = $files->getFile('uploadedfile');

        // Generate a new secure name
        $name = $file->getRandomName();

        // Move the file to it's new home
        $file->move('/path/to/dir', $name);

        echo $file->getSize('mb');      // 1.23
        echo $file->getExtension();     // jpg
        echo $file->getType();          // image/jpg
}

你也可以通过HTML中提交的文件名去获取单个上传文件:

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

内容协商

你可以很轻松的通过 negotiate() 方法来完成信息内容类型的协商:

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

查看 Content Negotiation 获得更多细节。

类信息参考

注解

除了这里列出的,本类还继承了 Request ClassMessage Class 的方法。

以下方法由父类提供:

  • CodeIgniter\HTTP\Request::getIPAddress()
  • CodeIgniter\HTTP\Request::validIP()
  • CodeIgniter\HTTP\Request::getMethod()
  • CodeIgniter\HTTP\Request::getServer()
  • CodeIgniter\HTTP\Message::body()
  • CodeIgniter\HTTP\Message::setBody()
  • CodeIgniter\HTTP\Message::populateHeaders()
  • CodeIgniter\HTTP\Message::headers()
  • CodeIgniter\HTTP\Message::header()
  • CodeIgniter\HTTP\Message::headerLine()
  • CodeIgniter\HTTP\Message::setHeader()
  • CodeIgniter\HTTP\Message::removeHeader()
  • CodeIgniter\HTTP\Message::appendHeader()
  • CodeIgniter\HTTP\Message::protocolVersion()
  • CodeIgniter\HTTP\Message::setProtocolVersion()
  • CodeIgniter\HTTP\Message::negotiateMedia()
  • CodeIgniter\HTTP\Message::negotiateCharset()
  • CodeIgniter\HTTP\Message::negotiateEncoding()
  • CodeIgniter\HTTP\Message::negotiateLanguage()
  • CodeIgniter\HTTP\Message::negotiateLanguage()
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

返回类型:

mixed|null

第一个参数包含需要查找的数据名

$request->getVar('some_data');

如数据不存在则返回 null 。

只需传递期望的过滤类型到第二个参数,就可以帮助你完成数据过滤

$request->getVar('some_data', FILTER_SANITIZE_STRING);

不传任何参数会得到一个包含全部 REQUEST 数据的数组。

第一个参数 null ,第二个参数设置过滤类型,可获得一个被过滤的包涵全部 REQUEST 数据的数组

$request->getVar(null, FILTER_SANITIZE_STRING); // returns all POST items with string sanitation

获取多个键值的信息,可以将需要的键值以数组形式传递给第一个参数

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

与之前一样,此时传递过滤类型给第二个参数,也可获得过滤后的数据

$request->getVar(['field1', 'field2'], FILTER_SANITIZE_STRING);
getGet([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) -- 需要查找的数据名。
  • $filter (int) --

    过滤类型。参见列表 查看

  • $flags (int) --

    过滤器名,值为过滤器的预定义变量名。 参见列表 查看

返回:

不传参数会返回 GET 中的所有元素,传参并且参数存在则返回对应的 GET 值,不存在返回 null

返回类型:

mixed|null

该方法与 getVar() 类似, 只返回 GET 的数据。

getPost([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) -- 需要查找的数据名。
  • $filter (int) --

    过滤类型。参见列表 查看

  • $flags (int) --

    过滤器名,值为过滤器的预定义变量名。 参见列表 查看

返回:

不传参数会返回 POST 中的所有元素,传参并且参数存在则返回对应的 POST 值,不存在返回 null

返回类型:

mixed|null

该方法与 getVar() 类似, 只返回 POST 的数据。

getPostGet([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) -- 需要查找的数据名。
  • $filter (int) --

    过滤类型。参见列表 查看

  • $flags (int) --

    过滤器名,值为过滤器的预定义变量名。 参见列表 查看

返回:

不传参数会返回 POST/GET 中的所有元素,传参并且参数存在则返回对应的 POST/GET 值,不存在返回 null

返回类型:

mixed|null

该方法和 getPost()getGet() 类似,它会同时查找 POST 和 GET 两个数组来获取数据, 先查找 POST ,再查找 GET:

$request->getPostGet('field1');
getGetPost([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) -- 需要查找的数据名。
  • $filter (int) --

    过滤类型。参见列表 查看

  • $flags (int) --

    过滤器名,值为过滤器的预定义变量名。 参见列表 查看

返回:

不传参数会返回 POST/GET 中的所有元素,传参并且参数存在则返回对应的 POST/GET 值,不存在返回 null

返回类型:

mixed|null

该方法和 getPost()getGet() 类似,它会同时查找 POST 和 GET 两个数组来获取数据, 先查找 GET ,再查找 POST:

$request->getGetPost('field1');
getCookie([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) -- COOKIE 名。
  • $filter (int) --

    过滤类型。参见列表 查看

  • $flags (int) --

    过滤器名,值为过滤器的预定义变量名。 参见列表 查看

返回:

不传参数会返回 COOKIE 中的所有元素,传参并且参数存在则返回对应的 COOKIE 值,不存在返回 null

返回类型:

mixed

该方法与 getPost()getGet() 类似, 只返回 COOKIE 的数据

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

获取多个键值的信息,可以将需要的键值以数组形式传递给第一个参数

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

注解

Cookie Helper function get_cookie() 不同, 该方法不会自动添加配置中 $config['cookie_prefix'] 的值。

getServer([$index = null[, $filter = null[, $flags = null]]])
参数:
  • $index (string) -- 服务器信息名。
  • $filter (int) --

    过滤类型。参见列表 查看

  • $flags (int) --

    过滤器名,值为过滤器的预定义变量名。 参见列表 查看

返回:

不传参数会返回 SERVER 中的所有元素,传参并且参数存在则返回对应的 SERVER 值,不存在返回 null

返回类型:

mixed

该方法与 getPost()getGet()getCookie() 类似, 只返回 SERVER 的数据

$request->getServer('some_data');

获取多个键值的信息,可以将需要的键值以数组形式传递给第一个参数

$request->getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
getUserAgent([$filter = null])
参数:
  • $filter (int) --

    过滤类型。参见列表 查看

返回:

包含 User Agent 信息的字符串,不存在返回 null

返回类型:

mixed

该方法从服务器信息哪查找并以字符串形式返回 User Agent

$request->getUserAgent();