IncomingRequest クラス
IncomingRequest クラスは、ブラウザなどのクライアントからの HTTP リクエストのオブジェクト指向表現を提供します。これは Request クラスと Message クラスを拡張しており、下記のメソッドに加えて、これらのクラスのすべてのメソッドにアクセスできます。
リクエストへのアクセス
現在のクラスが CodeIgniter\Controller
の子孫である場合、既に設定済みのリクエストクラスのインスタンスはクラスプロパティとしてアクセスできます。
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class UserController extends Controller
{
public function index()
{
if ($this->request->isAJAX()) {
// ...
}
}
}
コントローラー内ではないが、アプリケーションのリクエストオブジェクトにアクセスする必要がある場合は、Services クラス を使用してコピーを取得できます。
<?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 を介した XHR リクエスト(例:fetch)ではデフォルトで送信されません。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()
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値はクッキーによって上書きされる可能性があり、request-orderで「C」を「P」の後に設定した場合、POST値がクッキーによって上書きされる可能性があります。
注記
受信リクエストのContent-Type
ヘッダーがapplication/json
に設定されている場合、getVar()
メソッドは$_REQUEST
データではなくJSONデータ を返します。
JSONデータの取得
getJSON()
を使用して、php://input
の内容をJSONストリームとして取得できます。
注記
このメソッドは、受信データが有効なJSONかどうかをチェックする手段がありません。JSONを期待している場合にのみ、このメソッドを使用してください。
<?php
$json = $request->getJSON();
デフォルトでは、JSONデータ内のオブジェクトはオブジェクトとして返されます。連想配列に変換する場合は、最初の引数にtrue
を渡します。
2番目と3番目の引数は、json_decode() PHP関数の$depth
と$flags
引数に対応します。
JSONからの特定データの取得
JSONストリームから特定のデータを取得するには、取得したいデータの変数名をgetJsonVar()
に渡すか、「ドット」表記を使用して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"
オブジェクトではなく連想配列として結果を取得したい場合は、2番目の引数に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
入力データのフィルタリング
アプリケーションのセキュリティを維持するために、アクセスするすべての入力をフィルタリングする必要があります。これらのメソッドの2番目の引数として使用するフィルタの種類を渡すことができます。ネイティブのfilter_var()
関数がフィルタリングに使用されます。有効なフィルタの種類のリストについては、PHPマニュアルを参照してください。
POST変数のフィルタリングは次のようになります。
<?php
$email = $request->getPost('email', FILTER_SANITIZE_EMAIL);
getJSON()
とgetRawInput()
を除き、上記で説明したすべてのメソッドは、2番目の引数として渡されたフィルタの種類をサポートしています。
ヘッダーの取得
headers()
メソッドを使用して、リクエストとともに送信されたヘッダーにアクセスできます。このメソッドは、すべてのヘッダーの配列を返し、キーはヘッダーの名前、値はCodeIgniter\HTTP\Header
のインスタンスです。
<?php
var_dump($request->headers());
/*
* Outputs:
* [
* 'Host' => CodeIgniter\HTTP\Header,
* 'Cache-Control' => CodeIgniter\HTTP\Header,
* 'Accept' => CodeIgniter\HTTP\Header,
* ]
*/
1つのヘッダーのみが必要な場合は、その名前を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...
}
すべての値を1行にまとめた文字列としてヘッダーの値が必要な場合は、getHeaderLine()
メソッドを使用できます。
<?php
// Accept-Encoding: gzip, deflate, sdch
echo 'Accept-Encoding: ' . $request->getHeaderLine('accept-encoding');
名前と値を1つの文字列に含めた完全なヘッダーが必要な場合は、ヘッダーを文字列としてキャストするだけです。
<?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]]])
- パラメータ:
- 戻り値:
パラメーターが指定されていない場合は
$_REQUEST
、それ以外の場合はREQUEST値が見つかった場合はその値、見つからない場合はnull- 戻り値の型:
array|bool|float|int|object|string|null
重要
このメソッドは下位互換性のためだけに存在します。新しいプロジェクトでは使用しないでください。既に使用している場合でも、より適切な別のメソッドを使用することをお勧めします。
このメソッドは
getGet()
と同一で、REQUESTデータを取得する点が異なります。
- getGet([$index = null[, $filter = null[, $flags = null]]])
- パラメータ:
- 戻り値:
パラメーターが指定されていない場合は
$_GET
、それ以外の場合はGET値が見つかった場合はその値、見つからない場合はnull- 戻り値の型:
array|bool|float|int|object|string|null
最初の引数は、検索するGET項目の名前を指定します。
<?php $request->getGet('some_data');
取得しようとしている項目が存在しない場合は、nullを返します。
2番目のオプションの引数を使用すると、PHPのフィルターを使用してデータを処理できます。目的のフィルターの種類を2番目の引数に渡します。
<?php $request->getGet('some_data', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
すべてのGET項目の配列を返すには、引数を指定せずに呼び出します。
すべてのGET項目を返し、フィルターを通過させるには、最初の引数をnullに設定し、2番目の引数に使用するフィルターを設定します。
<?php $request->getGet(null, FILTER_SANITIZE_FULL_SPECIAL_CHARS); // returns all GET items with string sanitation
複数のGETパラメーターの配列を返すには、必要なキーをすべて配列として渡します。
<?php $request->getGet(['field1', 'field2']);
同じルールが適用されます。フィルター処理してパラメーターを取得するには、2番目の引数に適用するフィルターの種類を設定します。
<?php $request->getGet(['field1', 'field2'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
- getPost([$index = null[, $filter = null[, $flags = null]]])
- パラメータ:
- 戻り値:
パラメーターが指定されていない場合は
$_POST
、それ以外の場合はPOST値が見つかった場合はその値、見つからない場合はnull- 戻り値の型:
array|bool|float|int|object|string|null
このメソッドは
getGet()
と同一で、POSTデータを取得する点が異なります。
- getPostGet([$index = null[, $filter = null[, $flags = null]]])
- パラメータ:
- 戻り値:
パラメーターが指定されていない場合は
$_POST
と$_GET
を結合した値(競合する場合はPOST値を優先)、それ以外の場合はPOST値を検索し、見つからない場合はGET値を検索し、値が見つからない場合はnullを返します。- 戻り値の型:
array|bool|float|int|object|string|null
このメソッドは
getPost()
とgetGet()
とほぼ同じ動作で、POSTとGETの両方のストリームからデータを検索します。最初にPOSTを、次にGETを検索します。<?php $request->getPostGet('field1');
インデックスが指定されていない場合、POSTとGETの両方のストリームを結合して返します。ただし、名前が競合する場合はPOSTデータが優先されます。
- getGetPost([$index = null[, $filter = null[, $flags = null]]])
- パラメータ:
- 戻り値:
パラメーターが指定されていない場合は
$_GET
と$_POST
を結合した値(競合する場合はGET値を優先)、それ以外の場合はGET値を検索し、見つからない場合はPOST値を検索し、値が見つからない場合はnullを返します。- 戻り値の型:
array|bool|float|int|object|string|null
このメソッドは
getPost()
とgetGet()
とほぼ同じ動作で、GETとPOSTの両方のストリームからデータを検索します。最初にGETを、次にPOSTを検索します。<?php $request->getGetPost('field1');
インデックスが指定されていない場合、GETとPOSTの両方のストリームを結合して返します。ただし、名前が競合する場合はGETデータが優先されます。
- getCookie([$index = null[, $filter = null[, $flags = null]]])
- パラメータ:
- 戻り値:
パラメーターが指定されていない場合は
$_COOKIE
、それ以外の場合はCOOKIE値が見つかった場合はその値、見つからない場合はnull- 戻り値の型:
array|bool|float|int|object|string|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]]])
- パラメータ:
- 戻り値:
見つかった場合は
$_SERVER
項目の値、見つからない場合はnull- 戻り値の型:
array|bool|float|int|object|string|null
このメソッドは
getPost()
、getGet()
、getCookie()
メソッドと同一で、サーバーデータ($_SERVER
)を取得する点が異なります。<?php $request->getServer('some_data');
複数の
$_SERVER
値の配列を返すには、必要なキーをすべて配列として渡します。<?php $request->getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
- getUserAgent()
- 戻り値:
サーバーデータにあるユーザーエージェント文字列。見つからない場合はnull。
- 戻り値の型:
このメソッドは、サーバーデータからユーザーエージェントインスタンスを返します。
<?php $request->getUserAgent();
- getPath()
- 戻り値:
baseURLを基準とした現在のURIパス
- 戻り値の型:
string
このメソッドは、baseURLを基準とした現在のURIパスを返します。
注記
v4.4.0より前では、
IncomingRequest::$uri
はベースURLの完全なアプリケーション設定を認識していない可能性があるため、「現在のURI」を決定する最も安全な方法でした。
- setPath($path)
バージョン4.4.0以降非推奨。
- パラメータ:
$path (
string
) – 現在のURIとして使用する相対パス
- 戻り値:
このIncoming Request
- 戻り値の型:
注記
v4.4.0より前では、主にテスト目的で使用され、URI検出に依存せずに現在のリクエストの相対パス値を設定できました。これにより、基盤となる
URI
インスタンスも新しいパスで更新されました。