説明

リクエストオブジェクトの取得

webmanは、自動的にリクエストオブジェクトをactionメソッドの最初の引数に注入します。例えば、

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $default_name = 'webman';
        // getリクエストからnameパラメータを取得。nameパラメータが渡されていない場合は$default_nameを返す。
        $name = $request->get('name', $default_name);
        // ブラウザに文字列を返す。
        return response('hello ' . $name);
    }
}

$requestオブジェクトを通じて、リクエストに関連する任意のデータを取得できます。

時には、他のクラスで現在のリクエストの$requestオブジェクトを取得したい場合があります。この時はアシスタント関数request()を使えばよいです。

リクエストパラメータの取得 get

全体のget配列を取得

$request->get();

リクエストにgetパラメータがなければ、空の配列が返されます。

get配列の特定の値を取得

$request->get('name');

get配列にこの値が含まれていない場合はnullが返されます。

getメソッドの2つ目の引数にデフォルト値を渡すこともでき、get配列に対応する値が見つからなければデフォルト値が返されます。例えば:

$request->get('name', 'tom');

リクエストパラメータの取得 post

全体のpost配列を取得

$request->post();

リクエストにpostパラメータがなければ、空の配列が返されます。

post配列の特定の値を取得

$request->post('name');

post配列にこの値が含まれていない場合はnullが返されます。

getメソッドと同様に、postメソッドの2つ目の引数にデフォルト値を渡すことができ、post配列に対応する値が見つからなければデフォルト値が返されます。例えば:

$request->post('name', 'tom');

アシスタント関数input()

$request->input()関数に似ており、すべてのパラメータを取得できます。input()アシスタント関数には2つの引数があります:

  1. name:取得するパラメータ名(空の場合、すべてのパラメータの配列を取得)
  2. default:デフォルト値(最初の引数で取得が失敗した場合、その値が使用されます)

例えば

// パラメータnameを取得
$name = input('name');
// パラメータnameを取得、存在しない場合はデフォルト値を使用
$name = input('name','張三');
// すべてのパラメータを取得
$all_params = input();

元のリクエストpostボディの取得

$post = $request->rawBody();

この機能は、php-fpmfile_get_contents("php://input");操作に似ています。HTTPの元のリクエストボディを取得します。これは、非application/x-www-form-urlencoded形式のpostリクエストデータを取得する際に非常に便利です。

ヘッダーの取得

全体のヘッダー配列を取得

$request->header();

リクエストにヘッダーパラメータがなければ、空の配列が返されます。すべてのキーは小文字です。

ヘッダー配列の特定の値を取得

$request->header('host');

ヘッダー配列にこの値が含まれていない場合はnullが返されます。すべてのキーは小文字です。

getメソッドと同様に、headerメソッドの2つ目の引数にデフォルト値を渡すことができ、header配列に対応する値が見つからなければデフォルト値が返されます。例えば:

$request->header('host', 'localhost');

クッキーの取得

全体のクッキー配列を取得

$request->cookie();

リクエストにクッキーパラメータがなければ、空の配列が返されます。

クッキー配列の特定の値を取得

$request->cookie('name');

クッキー配列にこの値が含まれていない場合はnullが返されます。

getメソッドと同様に、cookieメソッドの2つ目の引数にデフォルト値を渡すことができ、cookie配列に対応する値が見つからなければデフォルト値が返されます。例えば:

$request->cookie('name', 'tom');

すべての入力の取得

これはpostgetの集合を含みます。

$request->all();

特定の入力値の取得

postgetの集合から特定の値を取得します。

$request->input('name', $default_value);

一部の入力データを取得

postgetの集合から一部のデータを取得します。

// usernameとpasswordからなる配列を取得し、対応するキーがない場合は無視
$only = $request->only(['username', 'password']);
// avatarとageを除くすべての入力を取得
$except = $request->except(['avatar', 'age']);

コントローラパラメータを通じて入力を取得

<?php
namespace app\controller;
use support\Response;

class UserController
{
    public function create(string $name, int $age = 18): Response
    {
        return json(['name' => $name, 'age' => $age]);
    }
}

このコードのロジックは似ています。

<?php
namespace app\controller;
use support\Request;
use support\Response;

class UserController
{
    public function create(Request $request): Response
    {
        $name = $request->input('name');
        $age = (int)$request->input('age', 18);
        return json(['name' => $name, 'age' => $age]);
    }
}

詳細については、コントローラパラメータバインディングを参照してください。

アップロードファイルの取得

ヒント
アップロードファイルは、multipart/form-data形式のフォームを使用する必要があります。

全体のアップロードファイル配列を取得

$request->file();

フォームは次のようになります:

<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>

$request->file()が返す形式は次のようになります:

array (
    'file1' => object(webman\Http\UploadFile),
    'file2' => object(webman\Http\UploadFile)
)

これはwebman\Http\UploadFileインスタンスの配列です。webman\Http\UploadFileクラスは、PHPの組み込みクラスSplFileInfoを継承し、便利なメソッドを提供します。

<?php
namespace app\controller;

use support\Request;

class UploadController
{
    public function files(Request $request)
    {
        foreach ($request->file() as $key => $spl_file) {
            var_export($spl_file->isValid()); // ファイルが有効かどうか、例えばtrue|false
            var_export($spl_file->getUploadExtension()); // アップロードされたファイルの拡張子、例えば'jpg'
            var_export($spl_file->getUploadMimeType()); // アップロードされたファイルのmimeタイプ、例えば'image/jpeg'
            var_export($spl_file->getUploadErrorCode()); // アップロードエラーコードを取得、例えばUPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
            var_export($spl_file->getUploadName()); // アップロードされたファイル名、例えば'my-test.jpg'
            var_export($spl_file->getSize()); // ファイルサイズを取得、例えば13364、単位はバイト
            var_export($spl_file->getPath()); // アップロードされたディレクトリを取得、例えば'/tmp'
            var_export($spl_file->getRealPath()); // 一時ファイルのパスを取得、例えば'/tmp/workerman.upload.SRliMu'
        }
        return response('ok');
    }
}

注意:

  • ファイルがアップロードされた後、は一時ファイルとして命名されます。例:/tmp/workerman.upload.SRliMu
  • アップロードファイルのサイズは、defaultMaxPackageSizeに制限され、デフォルトは10Mです。config/server.phpファイルでmax_package_sizeを変更してデフォルト値を変更できます。
  • リクエストが終了すると、一時ファイルは自動的に削除されます。
  • リクエストにアップロードファイルがない場合、$request->file()は空の配列を返します。
  • アップロードされたファイルはmove_uploaded_file()メソッドをサポートしません。代わりに$file->move()メソッドを使用してください。以下の例を参照してください。

特定のアップロードファイルの取得

$request->file('avatar');

ファイルが存在する場合は、対応するwebman\Http\UploadFileインスタンスが返され、存在しない場合はnullが返されます。

<?php
namespace app\controller;

use support\Request;

class UploadController
{
    public function file(Request $request)
    {
        $file = $request->file('avatar');
        if ($file && $file->isValid()) {
            $file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
            return json(['code' => 0, 'msg' => 'upload success']);
        }
        return json(['code' => 1, 'msg' => 'file not found']);
    }
}

ホストの取得

リクエストのホスト情報を取得します。

$request->host();

リクエストのアドレスが標準の80または443ポートでない場合、ホスト情報にはポートが含まれるかもしれません。例えばexample.com:8080。ポートが不要な場合、最初の引数にtrueを渡すことができます。

$request->host(true);

リクエストメソッドの取得

 $request->method();

返される値はGETPOSTPUTDELETEOPTIONSHEADのいずれかです。

リクエストURIの取得

$request->uri();

リクエストのuriを返します。パスとクエリ文字列を含みます。

リクエストパスの取得

$request->path();

リクエストのパス部分を返します。

リクエストクエリ文字列の取得

$request->queryString();

リクエストのクエリ文字列部分を返します。

リクエストURLの取得

url()メソッドは、QueryパラメータなしのURLを返します。

$request->url();

返されるのは//www.workerman.net/workerman-chatのようになります。

fullUrl()メソッドは、QueryパラメータありのURLを返します。

$request->fullUrl();

返されるのは//www.workerman.net/workerman-chat?type=downloadのようになります。

注意
url()fullUrl()は、プロトコル部分(httpまたはhttps)を返しません。
ブラウザでは//example.comのように、//で始まるアドレスは現在のサイトのプロトコルを自動的に認識し、httpまたはhttpsを使ってリクエストを自動的に行います。

nginxプロキシを使用している場合は、proxy_set_header X-Forwarded-Proto $scheme;をnginx設定に追加してください。nginxプロキシの参考に従い、
これにより、$request->header('x-forwarded-proto');を使用してhttpかhttpsかを判断できます。例えば:

echo $request->header('x-forwarded-proto'); // httpまたはhttpsを出力

リクエストHTTPバージョンの取得

$request->protocolVersion();

返されるのは文字列1.1または1.0です。

リクエストセッションIDの取得

$request->sessionId();

文字、数字からなる文字列を返します。

リクエストクライアントIPの取得

$request->getRemoteIp();

リクエストクライアントポートの取得

$request->getRemotePort();

リクエストクライアントの実際のIPの取得

$request->getRealIp($safe_mode=true);

プロジェクトでプロキシ(例えばnginx)を使用している場合、$request->getRemoteIp()が返すのは往々にしてプロキシサーバーのIP(例えば127.0.0.1192.168.x.x)で、クライアントの実際のIPではないことが多いです。この場合、$request->getRealIp()を使ってクライアントの実際のIPを取得することができます。

$request->getRealIp()は、HTTPヘッダーのx-forwarded-forx-real-ipclient-ipx-client-ipviaフィールドから実際のIPを取得しようとします。

HTTPヘッダーは容易に偽装されるため、この方法で取得したクライアントIPは100%信頼できるわけではありません。特に$safe_modeがfalseの場合です。プロキシを通じてクライアントの実際のIPを取得するための比較的信頼性の高い方法は、安全なプロキシサーバーのIPを知られていること、そして実際のIPを含むHTTPヘッダーがどれかを明確に理解していることです。もし$request->getRemoteIp()が安全なプロキシサーバーとして確認されたIPを返すなら、その後、$request->header('実際のIPを含むHTTPヘッダー')から実際のIPを取得します。

サーバーIPの取得

$request->getLocalIp();

サーバーポートの取得

$request->getLocalPort();

AJAXリクエストかどうかの判断

$request->isAjax();

PJAXリクエストかどうかの判断

$request->isPjax();

JSONレスポンスが期待されているかどうかの判断

$request->expectsJson();

クライアントがJSONレスポンスを受け入れるかどうかの判断

$request->acceptJson();

リクエストのプラグイン名の取得

非プラグインリクエストは空の文字列''を返します。

$request->plugin;

リクエストのアプリケーション名の取得

単一アプリケーションの場合、常に空の文字列''を返し、複数アプリケーションの場合、アプリケーション名を返します。

$request->app;

クロージャ関数は任意のアプリケーションに属さないため、クロージャルートからのリクエストは$request->appが常に空の文字列''を返します。
クロージャルートについてはルートを参照してください。

リクエストのコントローラークラス名の取得

コントローラーに対応するクラス名を取得します。

$request->controller;

返されるのはapp\controller\IndexControllerのようになります。

クロージャ関数は任意のコントローラーに属さないため、クロージャルートからのリクエストは$request->controllerが常に空の文字列''を返します。
クロージャルートについてはルートを参照してください。

リクエストのメソッド名の取得

リクエストに対応するコントローラーメソッド名を取得します。

$request->action;

返されるのはindexのようになります。

クロージャ関数は任意のコントローラーに属さないため、クロージャルートからのリクエストは$request->actionが常に空の文字列''を返します。
クロージャルートについてはルートを参照してください。

パラメータの上書き

時には、リクエストのパラメータを上書きしたい場合があります。例えば、リクエストをフィルタリングしてから、リクエストオブジェクトに再代入することができます。この時、setGet() setPost() setHeader()メソッドを使用できます。

GETパラメータの上書き

$request->get(); // 例えば['name' => 'tom', 'age' => 18]を得ると仮定します。
$request->setGet(['name' => 'tom']);
$request->get(); // 最終的に['name' => 'tom']を得ます。

注意
例に示されているように、setGet()はすべてのGETパラメータを上書きします。同様の動作をするsetPost() setHeader()もあります。

POSTパラメータの上書き

$post = $request->post();
foreach ($post as $key => $value) {
    $post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // フィルタリングされたpostパラメータを取得

HEADERパラメータの上書き

$request->setHeader(['host' => 'example.com']);
$request->header('host'); // example.comを出力