Laravel 5.1 HTTPレスポンス

基本のレスポンス

当然ながらルートやコントローラーは全て、ユーザーのブラウザーへ何らかのレスポンスを返す必要があります。Laravelはレスポンスを返すために様々な手段を用意しています。一番基本的なレスポンスは、ルートかコントローラーから単に文字列を返します。

Route::get('/', function () {
    return 'Hello World';
});

指定された文字列は、フレームワークによりHTTPレスポンスへ変換されます。

しかし通常、ほとんどのルートとコントローラーアクションからは、Illuminate\Http\Responseインスタンスか、ビューを返します。Responseインスタンスを返せば、レスポンスのHTTPステータスコードやヘッダーがカスタマイズできます。Responseインスタンスは、Symfony\Component\HttpFoundation\Responseを継承しており、HTTPレスポンスを組み立てるために数多くのメソッドが提供されています。

use Illuminate\Http\Response;

Route::get('home', function () {
    return (new Response($content, $status))
                  ->header('Content-Type', $value);
});

responseヘルパも、便利に使用できます。

Route::get('home', function () {
    return response($content, $status)
                  ->header('Content-Type', $value);
});

注目: Responseメソッドの完全なリストは、APIドキュメントと、SymfonyのAPIドキュメントをご覧ください。

ヘッダーの付加

レスポンスを速やかに組み立てられるようにほとんどのレスポンスメソッドは、チェーンとしてつなげられることを覚えておいてください。たとえば、ユーザーにレスポンスを送り返す前に、headerメソッドでいくつかのヘッダーを追加できます。

return response($content)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

クッキーの付加

withCookieヘルパメソッドをレスポンスインスタンスに使えば、簡単にクッキーを付加できます。たとえば、withCookieメソッドを使いクッキーを作成し、レスポンスインスタンスに付加できます。

return response($content)->header('Content-Type', $type)
                 ->withCookie('name', 'value');

withCookieメソッドはクッキーのプロパティーをカスタマイズするためのオプション引数を受け付けます。

->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)

Laravelにより生成されるクッキーは、クライアントにより変更されたり読まれたりされないようにデフォルトで暗号化され、署名されます。アプリケーションで生成する特定のクッキーで暗号化を無効にしたい場合は、App\Http\Middleware\EncryptCookiesミドルウェアの$exceptプロパティで指定してください。

/**
 * 暗号化すべきでないクッキーの名前
 *
 * @var array
 */
protected $except = [
    'cookie_name',
];

他のレスポンスタイプ

responseヘルパは、他のタイプのレスポンスインスタンスを生成するために便利です。responseヘルパが引数なしで呼び出されると、Illuminate\Contracts\Routing\ResponseFactory契約が返されます。この契約はレスポンスを生成するための、様々なメソッドを提供しています。

Viewレスポンス

レスポンスのステータスやヘッダーをコントロールしながらも、レスポンス内容としてビューを返す必要がある場合は、viewメソッドを使用してください。

return response()->view('hello', $data)->header('Content-Type', $type);

もちろん、カスタムHTTPステータスコードやヘッダーの指定が不必要であれば、シンプルにグローバルviewヘルパ関数を使用することもできます。

JSONレスポンス

jsonメソッドは自動的にContent-Typeヘッダーをapplication/jsonにセットし、同時に指定された配列をjson_encode PHP関数によりJSONへ変換します。

return response()->json(['name' => 'Abigail', 'state' => 'CA']);

JSONPレスポンスを生成したい場合は、jsonメソッドに追加してsetCallbackを使用してください。

return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));

Fileダウンロード

downloadメソッドは指定したパスのファイルをダウンロードようにブラウザに強要するレスポンスを生成するために使用します。downloadメソッドはファイル名を第2引数として受け取り、ユーザーがダウンロードするファイル名になります。第3引数にHTTPヘッダーの配列を渡すこともできます。

return response()->download($pathToFile);

return response()->download($pathToFile, $name, $headers);

注意: ファイルダウンロードを管理しているSymfony HttpFoundationクラスは、ASCIIのダウンロードファイル名を指定するよう要求しています。

リダイレクト

リダイレクトのレスポンスはIlluminate\Http\RedirectResponseクラスのインスタンスであり、ユーザーを他のURLへリダイレクトさせるために必要なしっかりとしたヘッダーを含んでいます。RedirectResponseインスタンスを生成するには様々な方法があります。一番簡単な方法は、グローバルなredirectヘルパメソッドを使う方法です。

Route::get('dashboard', function () {
    return redirect('home/dashboard');
});

たとえばバリデーション失敗時のように、直前のページヘユーザーをリダイレクトさせたい場合も時々あるでしょう。グローバルなbackヘルパ関数を使ってください。

Route::post('user/profile', function () {
    // リクエストのバリデーション…

    return back()->withInput();
});

名前付きルートへのリダイレクト

redirectヘルパを引数無しで呼ぶと、Illuminate\Routing\Redirectorインスタンスが返され、Redirectorインスタンスのメソッドが呼び出せるようになります。たとえば、名前付きルートに対するRedirectResponseを生成したい場合は、routeメソッドが使えます。

return redirect()->route('login');

ルートにパラメーターがある場合は、routeメソッドの第2引数として渡してください。

// profile/{id}のルート定義に対するリダイレクト

return redirect()->route('profile', [1]);

Eloquentモデルの"ID"をルートパラメーターとしてリダイレクトする場合は、モデルをそのまま渡してください。IDは自動的にとり出されます。

return redirect()->route('profile', [$user]);

コントローラーアクションへのリダイレクト

コントローラーアクションに対するリダイレクトを生成することもできます。そのためには、コントローラーとアクションの名前をactionメソッドに渡してください。LaravelのRouteServiceProviderにより、デフォルトのコントローラー名前空間が自動的に設定されるため、コントローラーの完全名前空間名を指定する必要がないことを覚えておいてください。

return redirect()->action('HomeController@index');

もちろん、コントローラールートにパラメーターが必要ならば、actionメソッドの第2引数として渡してください。

return redirect()->action('UserController@profile', [1]);

フラッシュデータを保存するリダイレクト

新しいURLへリダイレクトし、セッションへフラッシュデータを保存するのは、一度にまとめて行われる典型的な作業です。そのため便利なように、RedirectResponseを生成し、同時に一つのメッソッドをチェーンするだけでセッションへフラッシュデータを保存できます。これは特にアクションの後の状況を説明するメッセージを保存する場合に便利です。

Route::post('user/profile', function () {
    // ユーザープロフィールの更新…

    return redirect('dashboard')->with('status', 'プロファイル更新!');
});

もちろん、ユーザーを新しいページヘリダイレクトした後、セッションへ保存したフラッシュデータのメッセージを取り出し、表示する必要があります。たとえばBlade記法を使ってみましょう。

@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif

レスポンスマクロ

いろいろなルートやコントローラーで、再利用するためのカスタムレスポンスを定義したい場合は、Illuminate\Contracts\Routing\ResponseFactoryに実装されているmacroメソッドを使ってください。

たとえば、サービスプロバイダーbootメソッドで定義します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Routing\ResponseFactory;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * サービス初期処理登録後に実行
     *
     * @param  ResponseFactory  $factory
     * @return void
     */
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('caps', function ($value) use ($factory) {
            return $factory->make(strtoupper($value));
        });
    }
}

macroメソッドは登録名を第1引数、クロージャーを第2引数に取ります。マクロのクロージャーはResponseFactoryの実装か、responseヘルパに対し、登録名で呼び出すことで、実行されます。

return response()->caps('foo');

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュを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)へ移動

その他

?

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