# 説明

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

webmanは自動的にリクエストオブジェクトをアクションメソッドの最初のパラメータに注入します。例えば、

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $default_name = 'webman';
        // クエリ文字列から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が返されます。

また、第2引数にデフォルト値を指定して、対応する値が見つからない場合にはデフォルト値を返すこともできます。例:

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

POSTパラメータの取得

完全なPOST配列を取得

$request->post();

リクエストにPOSTパラメータがない場合は空の配列が返されます。

POST配列の値を取得

$request->post('name');

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

GET方法と同様に、第2引数にデフォルト値を指定して、対応する値が見つからない場合にはデフォルト値を返すこともできます。例:

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

原始リクエストのPOSTボディの取得

$post = $request->rawBody();

これは php-fpmfile_get_contents("php://input"); に似た機能です。 application/x-www-form-urlencoded 形式以外のPOSTリクエストデータを取得する際に便利です。

ヘッダーの取得

完全なヘッダー配列を取得

$request->header();

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

ヘッダー配列の値を取得

$request->header('host');

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

GETメソッドと同様に、第2引数にデフォルト値を指定して、対応する値が見つからない場合にはデフォルト値を返すこともできます。例:

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

クッキーの取得

完全なクッキー配列を取得

$request->cookie();

リクエストにクッキーパラメータがない場合は空の配列が返されます。

クッキー配列の値を取得

$request->cookie('name');

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

GETメソッドと同様に、第2引数にデフォルト値を指定して、対応する値が見つからない場合にはデフォルト値を返すこともできます。例:

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

すべての入力を取得

post get の集合を含みます。

$request->all();

特定の入力値を取得

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

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

一部の入力データを取得

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

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

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

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

$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のような形です。ポートを除外する場合は、第1引数に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が出力されます