Laravel 5.2 HTTPリクエスト

リクエストの取得

依存注入により、現在のHTTPリクエストインスタンスを取得するには、タイプヒントでIlluminate\Http\Requestクラスをコントローラーのコンストラクターかメソッドに指定します。現在のリクエストインスタンスが、サービスコンテナにより、自動的に注入されます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

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;

class UserController extends Controller
{
    /**
     * 指定したユーザーの更新
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

基本のリクエスト情報

Illuminate\Http\Requestインスタンスは、Symfony\Component\HttpFoundation\Requestクラスを拡張しており、HTTPリクエストを調べるために数多くのメソッドを提供しています。提供されている便利なメソッドをいくつか紹介しましょう。

リクエストURIの取得

pathメソッドはリクエストURIを返します。もしリクエストがhttp://domain.com/foo/barに送られたとすると、pathメソッドはfoo/barを返します。

$uri = $request->path();

isメソッドにより、リクエストのURIが指定されたパターンに合致するかを確認できます。このメソッドでは*をワイルドカードとして使用できます。

if ($request->is('admin/*')) {
    //
}

パス情報ではなく、完全なURLを取得したい場合は、リクエストインスタンスに対しurlfullUrlメソッドを使用してください。

// クエリ文字列なし
$url = $request->url();

// クエリ文字列付き
$url = $request->fullUrl();

クエリパラメータ付きのフルURLを取得することもできます。たとえば、リクエストのターゲットがhttp://domain.com/fooの場合、次のメソッドはhttp://domain.com/foo?bar=bazを返します。

$url = $request->fullUrlWithQuery(['bar' => 'baz']);

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

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');

inputメソッドには第2引数としてデフォルト値を指定できます。この値はリクエストに指定した入力値が存在していない場合に返されます。

$name = $request->input('name', 'Sally');

フォームで配列入力を使用する場合は、「ドット」記法を使用しアクセスできます。

$name = $request->input('products.0.name');

$names = $request->input('products.*.name');

JSON入力値の取得

アプリケーションにJSONリクエストが送られ、Content-Typeヘッダプロパティにapplication/jsonが指定されていたら、inputメソッドによりJSON情報へアクセスできます。JSON配列の深い要素にアクセスするために、「ドット」記法も使用できます。

$name = $request->input('user.name');

入力値の存在チェック

リクエストに入力値が存在するかを調べるには、hasメソッドが使用できます。hasメソッドは値が存在し、かつ空文字ではない場合にtrueを返します。

if ($request->has('name')) {
    //
}

全入力データの取得

全入力を「配列」として受け取りたい場合は、allメソッドを使用します。

$input = $request->all();

入力データの一部取得

入力データの一部を取得する必要があるなら、onlyexceptメソッドが使用できます。両方のメソッドともに限定したい入力を「配列」や引数の並びとして指定します。

$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

動的プロパティ

Illuminate\Http\Requestインスタンスに対する動的プロパティとして、ユーザインプットにアクセスすることも可能です。例えば、アプリケーションのフォーム上にnameフィールドがあり、入力されたフィールド値にアクセスする場合は次の通りです。

$name = $request->name;

動的プロパティが使われた場合、Laravelは最初にリクエスト本体のパラメータ値、次にルートパラメータを探します。

直前の入力

Laravelでは入力を次のリクエスト一回を処理するまで保存することができます。これが特に便利なのは、バリデーションにエラーがあった場合にフォームを再表示する時です。しかし、Laravelに含まれるバリデーションサービスを使っていれば、こうしたメソッドを利用する必要はありません。組み込みバリデーション機能では自動的に利用します。

入力をフラッシュデータとして保存

Illuminate\Http\Requestインスタンスのflashメソッドは、現在の入力をセッションへ、アプリケーションに要求される次のユーザリクエストの処理中だけ利用できるフラッシュデータとして保存します。

$request->flash();

セッションへ入力の一部をフラッシュデータとして保存するには、flashOnlyflashExceptが使用できます。

$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ヘルパは便利です。指定した文字列の入力が存在していないときは、nullを返します。

<input type="text" name="username" value="{{ 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('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');

リクエスト中にファイルが存在しているかを判定するには、hadFileメソッドを使います。

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ドキュメントで、より詳細な情報が得られます。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる