今回は Requests のセクションを進めます。
HTTP Requests - Laravel - The PHP Framework For Web Artisans
Accessing The Request
前回出て来た内容がそのままでした。Request クラスはコンテナから設定され、Illuminate\Http\Request を type-hint として設定します。
public function store(Request $request)
これですね。そしてパラメータを受け取る時は
public function store(Request $request, $id)
次へ。
Basic Request Information
Illuminate\Http\Request は HTTP リクエストを扱うための様々なメソッドがあります。 Laravel の Illuminate\Http\Request は、Symfony\Component\HttpFoundation\Request を拡張して作られているようです。
Retrieving The Request URI
リクエストされた URL が http://domain.com/foo/bar だったとして、$request->path() を使うと foo/bar が取得できる。
また、 $request->is('admin/*') と言った指定の仕方をすると、リクエストのパスが admin/ で始まるかどうか調べられる。
フルパスの URL を取得したい時は $request->url() を使えば良い。
Retrieving The Request Method
リクエストの HTTP メソッドは
$method = $request->method();
これで post やら get が文字列として取得できる。メソッドがある特定の何かであるか調べるときは次のようにします。
if ($request->isMethod('post'))
isPost とか isGet とかのショートカット無いのかな…。
PSR-7 Requests
PSR-7 という標準があって、 HTTP Request / Response の内容が定義されているらしい。次のようにすることで、Laravel 上でも使えるようになるとのこと。
$ composer require symfony/psr-http-message-bridge
$ composer require zendframework/zend-diactoros
そして、コンテナ側に教える type-hint も変わります。
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
うーん、使った方が良いのか悪いのか。教えてエロい人!
Retrieving Input
Retrieving An Input Value
やっと出て来た入力値の取り方。こんな感じ。
$name = $request->input('name');
デフォルト値も設定できる。
$name = $request->input('name', 'Sally');
同じパラメータ名で複数値があったときは配列になるが、ドットでアクセスを簡略化できるらしい。
$name = $request->input('products.0.name');
Determining If An Input Value Is Present
if ($request->has('name')) {
とまぁ、こんな感じにパラメータの有無をチェックできる。パラメータが空文字だと(パラメータ名だけ渡ってきて値が入っていない状態)では、has メソッドは false を返すらしい。何かしら文字が入っていないと true にならないようだ。
Retrieving All Input Data
$request->all()
これで入力データの全てを array で返す。
Retrieving A Portion Of The Input Data
$input = $request->only('username', 'password');
$input = $request->except('credit_card');
パラメータ名の username / password だけを取得する時は only 、 credit_card パラメータ以外を返して欲しいときは except を使用する。分かりにくいけど引数は array になっているらしい。
うむむ… この syntal sugar は…。
Old Input
Laravel では標準機能として、リクエストの入力値をセッションに保存する機能が付いているらしい。使い方は簡単で
$request->flash();
のみ。フィールド名の指定もでき
$request->flashOnly('username', 'password');
$request->flashExcept('credit_card');
といった感じでフィールド指定や、除外ができる。それとこの機能は Validation サービスが自動的に使う場合もあるとのこと。
Flashing Input To The Session
入力画面の次のリダイレクト先で入力値を使うようなケースに有効なので、それをサポートする機能が Laravel にはあるらしい。
return redirect('form')->withInput();
こんな感じ。フォームに入力値を渡すサンプルなのは、何かいけてない気がするのは僕だけでしょうか。 パスワードなどを渡したくない場合は、以下の様に除外した入力値を withInput に渡してあげます。
return redirect('form')->withInput($request->except('password'));
いまどきはあり得ないと思うけど、バックエンドがデータベースだと死にますね。
Retrieving Old Data
遷移先の Controller で古いデータを明示的に取得でき、サンプルは以下のコードになる。
$username = $request->old('username');
old メソッドは session のブリッジで、session から値を取っているらしい。 グローバルの old helper は Blade template 上でも利用可能らしい。まだ、 Blade template が出て来てないのになぁ…。
{{ old('username') }}
こんな感じで、old input data を取得できるらしい。
Old data のライフサイクルについて、説明が無かったのが気になる。 session 上の Old data は次に $request->flash() するまで残り続けるのかどうか…。
Cookies
Retrieving Cookies From The Request
Laravel の Cookie データは、authentication code で署名され、全データが暗号化されています。サーバ側で暗号化するので、クライアント側で変更しても無効なものとして扱われるようです。 Laravel 上で cookie の値を取得する時は Request クラスのメソッドを使用します。
$value = $request->cookie('name');
Attaching A New Cookie To A Response
新しく cookie に値を設定するには、 Illuminate\Http\Response クラスの withCookie を使います。 withCookie は Symfony\Component\HttpFoundation\Cookie のインスタンスを受け取りますが、ショートカット関数の cookie helper を使うのが良いらしい。
Cookie に値を設定するコードはこちら。
$response = new Illuminate\Http\Response('Hello World');
$response->withCookie(cookie('name', 'value', $minutes));
return $response;
これは有効期限付きの Cookie になっているけど、長期間保存する Cookie も作れるらしい(5年)
$response->withCookie(cookie()->forever('name', 'value'));
cookie helper の返す値に対して forever で設定。本当に forever じゃないので注意。
Files
Retrieving Uploaded Files
アップロードされたファイルは file メソッドで読み込める。file メソッドが返すのは Symfony\Component\HttpFoundation\File\UploadedFile となっていて、これは PHP の SplFileInfo を拡張したものらしい。書いてて、さっぱりわからん。
Verifying File Presence
$request->has ではなくて、 $request->hasFile でファイルの有無を調べられる。
Validating Successful Uploads
最後までアップロード出来たかどうかは、 $request->file('photo')->isValid() で調べる。
Moving Uploaded Files
アップロードされたファイルは、PHP の設定で定義されたテンポラリ領域に保存される。 $request->file('photo')->move() で永続的な領域に移動するらしい。
$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);
うーん。テンポラリに置くのもコピーするのも良いけど、フロントエンドが複数台サーバの場合はどうするんだろうなぁ。
Other File Methods
アップロードしたファイルは UploadFile クラスのインスタンスだったようで、他にも機能は色々あり、API Document 参照とのこと
運用時を考えると色々不安な面を残しつつ、続いて Responses へ。
ちなみにこのエントリでは話に出なかった Request を使った時のエラーメッセージをカスタマイズしたい時は以下のエントリを参考にどうぞ。