リクエスト

概要

Flight は HTTP リクエストを単一のオブジェクトにカプセル化し、以下の方法でアクセスできます:

$request = Flight::request();

理解

HTTP リクエストは、HTTP ライフサイクルの理解に不可欠なコア要素の一つです。ユーザーがウェブブラウザや HTTP クライアントでアクションを実行すると、ヘッダー、本文、URL などをあなたのプロジェクトに送信します。これらのヘッダー(ブラウザの言語、扱える圧縮の種類、ユーザーエージェントなど)をキャプチャし、Flight アプリケーションに送信された本文と URL をキャプチャできます。これらのリクエストは、アプリが次に何をするかを理解するために不可欠です。

基本的な使用方法

PHP には $_GET$_POST$_REQUEST$_SERVER$_FILES$_COOKIE などのスーパーグローバルがあります。Flight はこれらを便利な Collections に抽象化します。querydatacookiesfiles プロパティを配列またはオブジェクトとしてアクセスできます。

注意: プロジェクトでこれらのスーパーグローバルを使用することは強く推奨されません。request() オブジェクト経由で参照してください。

注意: $_ENV の抽象化は利用できません。

$_GET

$_GET 配列は query プロパティ経由でアクセスできます:

// GET /search?keyword=something
Flight::route('/search', function(){
    $keyword = Flight::request()->query['keyword'];
    // または
    $keyword = Flight::request()->query->keyword;
    echo "You are searching for: $keyword";
    // $keyword でデータベースをクエリしたり、その他のことを行います
});

$_POST

$_POST 配列は data プロパティ経由でアクセスできます:

Flight::route('POST /submit', function(){
    $name = Flight::request()->data['name'];
    $email = Flight::request()->data['email'];
    // または
    $name = Flight::request()->data->name;
    $email = Flight::request()->data->email;
    echo "You submitted: $name, $email";
    // $name と $email でデータベースに保存したり、その他のことを行います
});

$_COOKIE 配列は cookies プロパティ経由でアクセスできます:

Flight::route('GET /login', function(){
    $savedLogin = Flight::request()->cookies['myLoginCookie'];
    // または
    $savedLogin = Flight::request()->cookies->myLoginCookie;
    // 本当に保存されているかチェックし、保存されている場合は自動的にログインします
    if($savedLogin) {
        Flight::redirect('/dashboard');
        return;
    }
});

新しいクッキー値の設定に関するヘルプについては、overclokk/cookie を参照してください。

$_SERVER

$_SERVER 配列は getVar() メソッド経由でアクセスするためのショートカットがあります:


$host = Flight::request()->getVar('HTTP_HOST');

$_FILES

アップロードされたファイルは files プロパティ経由でアクセスできます:

// $_FILES プロパティへの生アクセス。推奨アプローチは以下を参照
$uploadedFile = Flight::request()->files['myFile']; 
// または
$uploadedFile = Flight::request()->files->myFile;

詳細については Uploaded File Handler を参照してください。

ファイルアップロードの処理

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());
    }
});

セキュリティ注意: ユーザー入力の検証とサニタイズを常に実行してください。特にファイルアップロードの場合、許可する拡張子の種類を検証し、ファイルの「マジックバイト」を検証して、ユーザーが主張するファイルの種類であることを確認してください。このヘルプには 記事 ライブラリ が利用可能です。

リクエスト本文

POST/PUT リクエストなどの生の HTTP リクエスト本文を取得するには、以下のようにします:

Flight::route('POST /users/xml', function(){
    $xmlBody = Flight::request()->getBody();
    // 送信された XML で何かを行います。
});

JSON 本文

コンテンツタイプ application/json のリクエストを受け取り、例として {"id": 123} のデータの場合、data プロパティから利用可能です:

$id = Flight::request()->data->id;

リクエストヘッダー

getHeader() または getHeaders() メソッドを使用してリクエストヘッダーにアクセスできます:


// Authorization ヘッダーが必要な場合
$host = Flight::request()->getHeader('Authorization');
// または
$host = Flight::request()->header('Authorization');

// すべてのヘッダーを取得する場合
$headers = Flight::request()->getHeaders();
// または
$headers = Flight::request()->headers();

リクエストメソッド

method プロパティまたは getMethod() メソッドを使用してリクエストメソッドにアクセスできます:

$method = Flight::request()->method; // 実際には getMethod() で設定されます
$method = Flight::request()->getMethod();

注意: getMethod() メソッドは最初に $_SERVER['REQUEST_METHOD'] からメソッドを引き出し、存在する場合に $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] または $_REQUEST['_method'] で上書きできます。

リクエストオブジェクトのプロパティ

リクエストオブジェクトは以下のプロパティを提供します:

  • 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 - 投稿データまたは JSON データ
  • cookies - クッキーデータ
  • files - アップロードされたファイル
  • secure - 接続がセキュアかどうか
  • accept - HTTP accept パラメータ
  • proxy_ip - クライアントのプロキシ IP アドレス。$_SERVER 配列を HTTP_CLIENT_IPHTTP_X_FORWARDED_FORHTTP_X_FORWARDEDHTTP_X_CLUSTER_CLIENT_IPHTTP_FORWARDED_FORHTTP_FORWARDED の順でスキャンします。
  • host - リクエストホスト名
  • servername - $_SERVER からの SERVER_NAME

ヘルパーメソッド

URL の一部を組み合わせたり、特定のヘッダーを扱うためのいくつかのヘルパーメソッドがあります。

フル URL

getFullUrl() メソッドを使用してフルリクエスト URL にアクセスできます:

$url = Flight::request()->getFullUrl();
// https://example.com/some/path?foo=bar

ベース URL

getBaseUrl() メソッドを使用してベース URL にアクセスできます:

// http://example.com/path/to/something/cool?query=yes+thanks
$url = Flight::request()->getBaseUrl();
// https://example.com
// 注意: 末尾のスラッシュはありません。

クエリ解析

parseQuery() メソッドに URL を渡すと、クエリ文字列を連想配列に解析できます:

$query = Flight::request()->parseQuery('https://example.com/some/path?foo=bar');
// ['foo' => 'bar']

コンテンツ Accept タイプのネゴシエーション

v3.17.2

negotiateContentType() メソッドを使用して、クライアントが送信した Accept ヘッダーに基づいて、最適なコンテンツタイプを決定できます。


// 例: Accept ヘッダー: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
// 以下でサポートするものを定義します。
$availableTypes = ['application/json', 'application/xml'];
$typeToServe = Flight::request()->negotiateContentType($availableTypes);
if ($typeToServe === 'application/json') {
    // JSON レスポンスを送信
} elseif ($typeToServe === 'application/xml') {
    // XML レスポンスを送信
} else {
    // デフォルトで何か他のものを設定するか、エラーをスロー
}

注意: Accept ヘッダーに利用可能なタイプが見つからない場合、メソッドは null を返します。Accept ヘッダーが定義されていない場合、メソッドは $availableTypes 配列の最初のタイプを返します。

関連項目

  • Routing - ルートをコントローラーにマッピングし、ビューをレンダリングする方法を参照。
  • Responses - HTTP レスポンスをカスタマイズする方法。
  • Why a Framework? - リクエストが全体像にどのように適合するかを理解。
  • Collections - データのコレクションを扱う。
  • Uploaded File Handler - ファイルアップロードの処理。

トラブルシューティング

  • request()->iprequest()->proxy_ip は、ウェブサーバーがプロキシ、ロードバランサーなどの背後にある場合に異なる可能性があります。

変更履歴

  • v3.17.2 - negotiateContentType() を追加
  • v3.12.0 - リクエストオブジェクト経由でファイルアップロードを扱う機能を追加。
  • v1.0 - 初回リリース。