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

もしくは、withHeadersメソッドで、レスポンスへ追加したいヘッダの配列を指定します。

return response($content)
            ->withHeaders([
                'Content-Type' => $type,
                'X-Header-One' => 'Header Value',
                'X-Header-Two' => 'Header Value',
            ]);

クッキーの付加

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

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

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

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

もしくは、Cookieファサードqueueメソッドを使い、レスポンスが送られる時点で自動的に付加されるクッキーを作成することもできます。

<?php

namespace App\Http\Controllers;

use Cookie;
use App\Http\Controllers\Controller;

class DashboardController extends Controller
{
    /**
     * アプリケーションダッシュボードの表示
     *
     * @return Response
     */
    public function index()
    {
        Cookie::queue('saw_dashboard', true, 15);

        return view('dashboard');
    }
}

この例の場合、saw_dashboardクッキーは、意図的にレスポンスインスタンスに添付するようにコードしなくても、レスポンスが返される時点で自動的にそのレスポンスへ追加されます。

クッキーと暗号化

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のダウンロードファイル名を指定するよう要求しています。

Fileレスポンス

fileメソッドは、ダウンロードの代わりに、ブラウザへ画像やPDFのようなファイルを表示するために使用します。このメソッドは第1引数にファイルパス、第2引数にヘッダの配列を指定します。

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

return response()->file($pathToFile, $headers);

リダイレクト

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

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

例えば送信されたフォーム内容にエラーがある場合など、直前のページヘユーザーをリダイレクトさせたい場合もあります。グローバルなbackヘルパ関数を使ってください。ただし、back関数を使用するルートはwebミドルウェアグループに属しているか、セッションミドルウェアが適用されることを確認してください。

Route::post('user/profile', function () {
    // レスポンスのバリデーション処理…

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

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

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

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

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

// profile/{id}のURIへのリダイレクト

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

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

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

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

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

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

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

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

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

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

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

    return redirect('dashboard')->with('status', 'Profile updated!');
});

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

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

レスポンスマクロ

いろいろなルートやコントローラーで、再利用するためのカスタムレスポンスを定義したい場合はResponseファサード、もしくはIlluminate\Contracts\Routing\ResponseFactoryの実装に対し、macroメソッドが使用できます。

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

<?php

namespace App\Providers;

use Response;
use Illuminate\Support\ServiceProvider;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * アプリケーションのレスポンスマクロ登録
     *
     * @return void
     */
    public function boot()
    {
        Response::macro('caps', function ($value) {
            return Response::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)へ移動

その他

?

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