リクエストの取得
依存注入により、現在のHTTPリクエストインスタンスを取得するには、タイプヒントでIlluminate\Http\Request
クラスをコントローラーのコンストラクターかメソッドに指定します。現在のリクエストインスタンスが、サービスプロバイダーにより、自動的に注入されます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 新しいユーザーを保存
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
もし、コントローラーメソッドでルートパラメーターも併用したい場合は、依存の指定の後にルート引数を続けてリストしてください。たとえば次のようにルートを定義している場合:
Route::put('user/{id}', 'UserController@update');
次のようにコントローラーメソッドの中で、まずタイプヒントでIlluminate\Http\Request
を指定し、それからルートパラメーターのid
へアクセスします。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 特定のユーザーの更新
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
基本のリクエスト情報
Illuminate\Http\Request
インスタンスは、HTTPリクエストを調べるために数多くのメソッドを提供しています。Laravel
Illuminate\Http\Request
はSymfony\Component\HttpFoundation\Request
クラスを拡張しています。このクラスにより提供されている便利なメソッドをいくつか紹介しましょう。
リクエストURIの取得
path
メソッドはリクエストURIを返します。もしリクエストがhttp://domain.com/foo/bar
に送られたとすると、path
メソッドはfoo/bar
を返します。
$uri = $request->path();
is
メソッドにより、リクエストのURIが指定されたパターンに合致するかを確認できます。このメソッドでは*
をワイルドカードとして使用できます。
if ($request->is('admin/*')) {
//
}
パス情報ではなく、完全なURLを取得したい場合は、リクエストインスタンスに対しurl
メソッドを使用してください。
$url = $request->url();
リクエストメソッドの取得
method
メソッドはリクエストのHTTP動詞を返します。また、isMethod
メソッドを使えば、指定した文字列とHTTP動詞が一致するかを調べることができます。
$method = $request->method();
if ($request->isMethod('post')) {
//
}
PSR-7リクエスト
PSR-7規約はリクエストとレスポンスを含めたHTTPメッセージのインターフェイスを規定しています。PSR-7リクエストのインスタンスを受け取りたければ、ライブラリーをいくつかインストールする必要があります。LaravelはLaravelリクエストとレスポンスをPSR-7互換の実装に変換するために、Symfony HTTPメッセージブリッジコンポーネントを使用しています。
composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros
ライブラリーをインストールしたら、後はただルートやコントローラーでリクエストタイプをタイプヒントで指定すれば、PSR-7リクエストが取得できます。
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
ルートかコントローラーからPSR-7レスポンスインスタンスを返せば、自動的にLaravelのレスポンスインスタンスに変換され、フレームワークにより表示されます。
入力の取得
入力値の取得
Illuminate\Http\Request
インスタンスのシンプルなメソッドを利用すれば、ユーザー入力の全てにアクセスできます。リクエストのHTTP動詞に気をもむ必要はありません。全ての動詞の入力に対し、同じ方法でアクセスできます。
$name = $request->input('name');
もしくは、Illuminate\Http\Request
インスタンスのプロパティーを利用し、ユーザー入力へアクセスできます。たとえば、アプリケーションのフォームがname
フィールドを持っている場合、入力されたフィールド値へ次のようにアクセスできます。
$name = $request->name;
input
メソッドには第2引数としてデフォルト値を指定できます。この値はリクエストに指定した入力値が存在していない場合に返されます。
$name = $request->input('name', 'Sally');
フォームで配列入力を使用する場合は、「ドット」記法を使用しアクセスできます。
$input = $request->input('products.0.name');
入力値の存在チェック
リクエストに入力値が存在するかを調べるには、has
メソッドが使用できます。has
メソッドは値が存在し、かつ空文字ではない場合にtrue
を返します。
if ($request->has('name')) {
//
}
全入力データの取得
全入力を「配列」として受け取りたい場合は、all
メソッドを使用します。
$input = $request->all();
入力データの一部取得
入力データの一部を取得する必要があるなら、only
やexcept
メソッドが使用できます。両方のメソッドともに限定したい入力を「配列」や引数の並びとして指定します。
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
直前の入力
Laravelでは入力を次のリクエスト一回を処理するまで保存することができます。これが特に便利なのは、バリデーションにエラーがあった場合にフォームを再表示する時です。しかし、Laravelに含まれるバリデーションサービスを使っていれば、こうしたメソッドを利用する必要はありません。組み込みバリデーション機能では自動的に利用します。
入力をフラッシュデータとして保存
Illuminate\Http\Request
インスタンスのflash
メソッドは、現在の入力をセッションへ、アプリケーションに要求される次のユーザーリクエストの処理中だけ利用できるフラッシュデータとして保存します。
$request->flash();
セッションへ入力の一部をフラッシュデータとして保存するには、flashOnly
とflashExcept
が使用できます。
$request->flashOnly('username', 'email');
$request->flashExcept('password');
入力をフラッシュデータとして保存しリダイレクト
入力をフラッシュデータとして保存する必要があるのは、直前のページヘリダイレクトする場合が多いでしょうから、withInput
メソッドをリダイレクトにチェーンして簡単に、入力をフラッシュデータとして保存できます。
return redirect('form')->withInput();
return redirect('form')->withInput($request->except('password'));
直前のデータを取得
直前のリクエストのフラッシュデータを取得するには、Request
インスタンスに対しold
メソッドを使用してください。old
メソッドはセッションにフラッシュデータとして保存されている入力を取り出すために役に立ちます。
$username = $request->old('username');
Laravelではold
ヘルパ関数も用意しています。特にBladeテンプレートで直前の入力値を表示したい場合、old
ヘルパは役に立ちます。
{{ old('username') }}
クッキー
リクエストからクッキーを取得
Laravelフレームワークが作成するクッキーは全て暗号化され、認証コードで著名されています。つまりクライアントにより変更されると、無効なクッキーとして取り扱います。リクエストからクッキー値を取得するには、Illuminate\Http\Request
インスタンスに対してcookie
メソッドを使用してください。
$value = $request->cookie('name');
レスポンスへ新しいクッキーを付ける
Laravelのグローバルcookie
ヘルパ関数は、新しいSymfony\Component\HttpFoundation\Cookie
インスタンスを生成する、シンプルなファクトリーとして動作します。そのクッキーは、withCookie
メソッドを使用し、Illuminate\Http\Response
インスタンスに付けます。
$response = new Illuminate\Http\Response('Hello World');
$response->withCookie(cookie('name', 'value', $minutes));
return $response;
長期間有効、つまり最低5年間存在するクッキーを作成するには、cookie
ヘルパに引数を付けずに呼び出すことで返されるクッキーファクトリーに対し、forever
メソッドをチェーンしてください。
$response->withCookie(cookie()->forever('name', 'value'));
ファイル
アップロードしたファイルの取得
アップロードしたファイルへアクセスするには、Illuminate\Http\Request
インスタンスに含まれているfile
メソッドを使用します。file
メソッドにより返されるオブジェクトは、Symfony\Component\HttpFoundation\File\UploadedFile
クラスで、PHPのSplFileInfo
クラスを拡張しているので、ファイル操作のために数多くのメソッドが提供されています。
$file = $request->file('photo');
ファイルの存在を確認
リクエストにファイルが存在しているかを調べるには、hasFile
メソッドが使用できます。
if ($request->hasFile('photo')) {
//
}
アップロードに成功したか確認
ファイルが存在しているかに付け加え、isValid
メソッドで問題なくアップロードできたのかを確認できます。
if ($request->file('photo')->isValid()) {
//
}
アップロードファイルの移動
アップロードしたファイルを別の場所へ移動するには、move
メソッドを使ってください。このメソッドはPHPの設定により決められるアップロード先の一時ディレクトリーから、指定されたより長期間保存するための場所へファイルを移動します。
$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);
他のファイルメソッド
他にもたくさんのメソッドが、UploadedFile
インスタンスに存在します。このクラスのAPIドキュメントにより詳細な情報が得られます。