説明
リクエストオブジェクトの取得
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つの引数があります:
- name:取得するパラメータ名(空の場合、すべてのパラメータの配列を取得)
- default:デフォルト値(最初の引数で取得が失敗した場合、その値が使用されます)
例えば
// パラメータnameを取得
$name = input('name');
// パラメータnameを取得、存在しない場合はデフォルト値を使用
$name = input('name','張三');
// すべてのパラメータを取得
$all_params = input();
元のリクエストpostボディの取得
$post = $request->rawBody();
この機能は、php-fpm
のfile_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');
すべての入力の取得
これは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']);
コントローラパラメータを通じて入力を取得
<?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();
返される値はGET
、POST
、PUT
、DELETE
、OPTIONS
、HEAD
のいずれかです。
リクエスト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.1
や192.168.x.x
)で、クライアントの実際のIPではないことが多いです。この場合、$request->getRealIp()
を使ってクライアントの実際のIPを取得することができます。
$request->getRealIp()
は、HTTPヘッダーのx-forwarded-for
、x-real-ip
、client-ip
、x-client-ip
、via
フィールドから実際の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を出力