レスポンスの基本

ルートからの文字列リターン

Laravelのルートから返す、一番基本的なレスポンスは文字列です。

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

カスタムレスポンスの生成

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

use Illuminate\Http\Response;

return (new Response($content, $status))
              ->header('Content-Type', $value);

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

return response($content, $status)
              ->header('Content-Type', $value);

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

レスポンスへのビュー送信

Responseクラスメソッドにアクセスする必要があるが、レスポンスの内容としてビューを返したい場合は、viewメソッドが便利でしょう。

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

クッキー付きレスポンス

return response($content)->withCookie(cookie('name', 'value'));

メソッドチェーン

ほとんどのResponseメソッドはチェーンできることを覚えておきましょう。レスポンスをスラスラ構築できます。

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

リダイレクト

リダイレクトのレスポンスには、ほとんどの場合Illuminate\Http\RedirectResponseクラスのインスタンスを使用します。このクラスは、ユーザーを他のURLへリダイレクトさせるために必要な、しっかりとしたヘッダーを含んでいます。

リダイレクトのリターン

RedirectResponseインスタンスを生成する方法はたくさんあります。一番シンプルな方法は、redirectヘルパーを使うことです。テストの時にリダイレクトレスポンスを生成するモックは一般的ではありませんから、ほとんどの場合、これで大丈夫でしょう。

return redirect('user/login');

フラッシュデータ指定のリダイレクト

新しいURLへリダイレクトし、フラッシュデーターをセッションへ保存するのは、同時に行われるのが典型的です。ですから、利便性を上げるために、RedirectResponseインスタンスを生成し、同時に同じメソッドチェーンで、フラッシュデーターをセッションへ保存することもできます。

return redirect('user/login')->with('message', 'Login Failed');

直前のURLへのリダイレクト

直前のURLへユーザーをリダイレクトしたい場合があります。例えば、フォーム送信後です。backメソッドで行います。

return redirect()->back();

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

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

redirectヘルパーを引数なしで呼び出すと、Illuminate\Routing\Redirectorのインスタンスが返されますので、このクラスのメソッドを呼び出すことができます。例えば、名前付きルートへのRedirectResponseを生成したい場合は、routeメソッドを使用します。

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

引数指定の名前付きルートへのリダイレクト

ルートに引数がある場合、routeメソッドの第2引数として指定できます。

// profile/{id}へのルート

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

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

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

名前付き引数指定の名前付きルートへのリダイレクト

//profile/{user}へのルート

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

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

名前付きルートへのRedirectResponseインスタンスの生成と同様に、コントローラーアクションへのリダイレクトも生成可能です。

return redirect()->action('App\Http\Controllers\HomeController@index');

注目: URL::setRootControllerNamespaceにより、コントローラーのルート名前空間が登録されていれば、完全な名前空間を指定する必要はありません。

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

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

名前付き引数指定のコントローラーアクションへのリダイレクト

return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);

その他のレスポンス

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

JSONレスポンスの生成

jsonメソッドは、Content-Typeヘッダーに、application/jsonを自動的にセットします。

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

JSONPレスポンスの生成

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

ファイルダウンロードレスポンスの生成

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

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

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

注意: ダウンロードを管理する、SymfonyのHttpFoundationは、ダウンロードするファイルの名前がASCIIファイル名であることを求めています。

レスポンスマクロ

様々なルートとコントローラーの中で再利用するために、カスタムレスポンスを定義したい場合は、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メソッドは名前を最初の引数、クロージャーを2つ目に取ります。マクロのクロージャーは、ResponseFactoryの実装か、responseヘルパーにマクロ名を付けて呼び出した時に、実行されます。

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