レスポンスの基本
ルートからの文字列リターン
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');