Laravel5.5 LTS 日本語ドキュメント

このリポジトリはPHP Webアプリフレームワークである、LaravelのLTSバージョンである5.5の公式英文ドキュメントを日本語へ翻訳しています。

This project is maintained by okinaka

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をタイプヒントで指定できます。そのルートが実行されると、送信されてきたリクエストをサービスコンテナが自動的にクロージャへ渡します。

use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
    //
});

リクエストパスとメソッド

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の取得

送信されたリクエストの完全なURLを取得する場合は、urlfullUrlメソッドを使用してください。urlメソッドはクエリストリングを除いたURLを返し、一方のfullUrlメソッドはクエリストリング付きで返します。

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

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

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

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) {
    //
});

{tip} ルートかコントローラからPSR-7レスポンスインスタンスを返せば、自動的にLaravelのレスポンスインスタンスに変換され、フレームワークにより表示されます。

入力のトリムとノーマライゼーション

Laravelのデフォルトグローバルミドルウェアスタックには、TrimStringsConvertEmptyStringsToNullミドルウェアが含まれています。これらのミドルウェアは、App\Http\Kernelクラスにリストされています。これらのミドルウェアは自動的にリクエストの全入力フィールドをトリムし、それと同時に空の文字列フィールドをnullへ変換します。これにより、ルートやコントローラで、ノーマライズについて心配する必要が無くなります。

この振る舞いを無効にするには、App\Http\Kernelクラスの$middlewareプロパティからこれらのミドルウェアを削除することにより、アプリケーションのミドルウェアスタックから外してください。

入力の取得

全入力データの取得

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

$input = $request->all();

入力値の取得

Illuminate\Http\Requestインスタンスのシンプルなメソッドを利用すれば、ユーザー入力の全てにアクセスできます。リクエストのHTTP動詞に気をもむ必要はありません。HTTP動詞に関わらず、inputメソッドでユーザー入力を取得できます。

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

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

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

配列での入力を含むフォームを取り扱うときは、「ドット」記法で配列へアクセスできます。

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

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

クエリストリングからの入力取得

inputメソッドは、クエリストリングも含めたリクエストペイロード全体から、値を取得するのに対し、queryメソッドはクエリストリングからのみ値を取得します。

$name = $request->query('name');

要求したクエリストリング値が存在しない場合、このメソッドの第2引数が返ってきます。

$name = $request->query('name', 'Helen');

queryメソッドに引数を渡さずに呼び出せば、連想配列ですべてのクエリストリングを取得できます。

$query = $request->query();

動的プロバティーでの入力取得

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

$name = $request->name;

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

JSON入力値の取得

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

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

入力データの一部取得

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

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

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

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

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

{tip} onlyメソッドは、要求したキー/値ペアをすべて返します。しかし、リクエスト中に存在しなかった場合、キー/値ペアは返ってきません。

入力値の存在チェック

リクエストに値が存在するかを判定するには、hasメソッドを使用します。hasメソッドは、リクエストに値が存在する場合に、trueを返します。

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

配列を指定した場合、hasメソッドは指定値がすべて存在するかを判定します。

if ($request->has(['name', 'email'])) {
    //
}

値がリクエストに存在しており、かつ空でないことを判定したい場合は、filledメソッドを使います。

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

直前の入力

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="">

クッキー

リクエストからクッキーを取得

Laravelフレームワークが作成するクッキーは全て暗号化され、認証コードで著名されています。つまりクライアントにより変更されると、無効なクッキーとして取り扱います。リクエストからクッキー値を取得するには、Illuminate\Http\Requestインスタンスに対してcookieメソッドを使用してください。

$value = $request->cookie('name');

もしくは、クッキー値にアクセスするために、Cookieファサードも利用できます。

$value = Cookie::get('name');

レスポンスへクッキーを付ける

送信するIlluminate\Http\Responseインスタンスへcookieメソッドを使い、クッキーを付加できます。このメソッドには、名前、値、それとこのクッキーが有効である分数を渡します。

return response('Hello World')->cookie(
    'name', 'value', $minutes
);

cookieメソッドには、あまり繁用されない、いくつかの引数を付けることもできます。そうした引数は、PHPネイティブのsetcookieメソッドの引数と、全般的に同じ目的や意味合いを持っています。

return response('Hello World')->cookie(
    'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);

もしくは、アプリケーションから送り出すレスポンスへアタッチするクッキーを「キュー」するために、Cookieファサードが使えます。queueメソッドは、CookieインスタンスかCookieインスタンスを生成するために必要な引数を受け取ります。こうしたクッキーは、ブラウザにレスポンスが送信される前にアタッチされます。

Cookie::queue(Cookie::make('name', 'value', $minutes));

Cookie::queue('name', 'value', $minutes);

Cookieインスタンスの生成

後からレスポンスインスタンスへ付けることが可能な、Symfony\Component\HttpFoundation\Cookieインスタンスを生成したければ、cookieグローバルヘルパが使えます。このクッキーはレスポンスインスタンスへアタッチしない限り、クライアントへ送信されません。

$cookie = cookie('name', 'value', $minutes);

return response('Hello World')->cookie($cookie);

ファイル

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

アップロードしたファイルへアクセスするには、Illuminate\Http\Requestインスタンスに含まれているfileメソッドか、動的プロパティを使用します。fileメソッドはIlluminate\Http\UploadedFileクラスのインスタンスを返します。これはPHPのSplFileInfoクラスを拡張してあり、様々なファイル操作のメソッドを提供しています。

$file = $request->file('photo');

$file = $request->photo;

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

if ($request->hasFile('photo')) {
    //
}

アップロードに成功したか確認

ファイルが存在しているかに付け加え、isValidメソッドで問題なくアップロードできたのかを確認できます。

if ($request->file('photo')->isValid()) {
    //
}

ファイルパスと拡張子

UploadedFileクラスはファイルの絶対パスと拡張子へアクセスするメソッドも提供しています。extensionメソッドは、ファイルのコンテンツを元に拡張子を推測します。この拡張子はクライアントから提供された拡張子と異なっている可能性があります。

$path = $request->photo->path();

$extension = $request->photo->extension();

他のファイルメソッド

他にも、たくさんのメソッドがUploadedFileインスタンスに存在しています。このクラスのAPIドキュメントで、より詳細な情報が得られます。

アップロードファイルの保存

アップロードファイルを保存するには、通常設定済みのファイルシステムの1つを使います。UploadedFileクラスのstoreメソッドは、ローカルにあろうが、Amazon S3のようなクラウドストレージであろうが、ディスクの1つへアップロードファイルを移動します。

storeメソッドへは、ファイルシステムで設定したルートディレクトリからの相対位置で、どこに保存するか指定します。このパスにはファイル名を含んではいけません。保存ファイル名として一意のIDが自動的に生成されるためです。

storeメソッドには、ファイルを保存するために使用するディスクの名前を任意の第2引数として指定もできます。メソッドはディスクルートからの相対ファイルパスを返します。

$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');

ファイル名を自動で生成したくない場合は、パスとファイル名、ディスク名を引数に取る、storeAsメソッドを使ってください。

$path = $request->photo->storeAs('images', 'filename.jpg');

$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

信用するプロキシの設定

TLS/SSL証明を行うロードバランサの裏でアプリケーションが実行されている場合、アプリケーションが時々HTTPSリンクを生成しないことに、気づくでしょう。典型的な理由は、トラフィックがロードバランサにより80番ポートへフォワーディングされるため、セキュアなリンクを生成すべきだと判断できないからです。

これを解決するには、Laravelアプリケーションに含まれている、App\Http\Middleware\TrustProxiesミドルウェアを使用します。これでアプリケーションにとって信用できるロードバランサやプロキシを簡単にカスタマイズできます。信用できるプロキシをこのミドルウェアの$proxiesプロパティへ配列としてリストしてください。信用するプロキシの設定に加え、オリジナルリクエストに関する情報を含む、プロキシから送られて来るヘッダも設定できます。

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * このアプリケーションで信用するプロキシ
     *
     * @var array
     */
    protected $proxies = [
        '192.168.1.1',
        '192.168.1.2',
    ];

    /**
     * 現在のプロキシヘッダのマップ
     *
     * @var array
     */
    protected $headers = [
        Request::HEADER_FORWARDED => 'FORWARDED',
        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
        Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    ];
}

全プロキシを信用

Amazon AWSや他の「クラウド」ロードバランサプロバイダを使用している場合は、実際のバランサのIPアドレスは分かりません。このような場合、全プロキシを信用するために、**を使います。

/**
 * The trusted proxies for this application.
 *
 * @var array
 */
protected $proxies = '**';