レスポンスの基本Basic Responses
ルートからの文字列リターンReturning Strings From Routes
Laravelのルートから返す、一番基本的なレスポンスは文字列です。The most basic response from a Laravel route is a string:
Route::get('/', function()
{
return 'Hello World';
});
カスタムレスポンスの生成Creating Custom Responses
しかし、ほとんどのルートとコントローラーアクションから、Illuminate\Http\Response
インスタンスか、ビューを返します。Response
インスタンスを返せば、レスポンスのHTTPステータスコードやヘッダーがカスタマイズできます。Response
インスタンスは、Symfony\Component\HttpFoundation\Response
を継承しており、HTTPレスポンスを組み立てるために数多くのメソッドを提供しています。However, for most routes and controller actions, you will be returning a full Illuminate\Http\Response
instance or a view[/docs/{{version}}/views]. Returning a full Response
instance allows you to customize the response's HTTP status code and headers. A Response
instance inherits from the Symfony\Component\HttpFoundation\Response
class, providing a variety of methods for building HTTP responses:
use Illuminate\Http\Response;
return (new Response($content, $status))
->header('Content-Type', $value);
response
ヘルパも、便利に使用できます。For convenience, you may also use the response
helper:
return response($content, $status)
->header('Content-Type', $value);
注目: Responseメソッドの完全なリストは、APIドキュメントと、SymfonyのAPIドキュメントをご覧ください。Note: For a full list of available
Response
methods, check out its API documentation[http://laravel.com/api/{{version}}/Illuminate/Http/Response.html] and the Symfony API documentation[http://api.symfony.com/2.5/Symfony/Component/HttpFoundation/Response.html].
レスポンスへのビュー送信Sending A View In A Response
Response
クラスメソッドにアクセスする必要があるが、レスポンスの内容としてビューを返したい場合は、view
メソッドが便利でしょう。If you need access to the Response
class methods, but want to return a view as the response content, you may use the view
method for convenience:
return response()->view('hello')->header('Content-Type', $type);
クッキー付きレスポンスAttaching Cookies To Responses
return response($content)->withCookie(cookie('name', 'value'));
メソッドチェーンMethod Chaining
ほとんどのResponse
メソッドはチェーンできることを覚えておきましょう。レスポンスをスラスラ構築できます。Keep in mind that most Response
methods are chainable, allowing for the fluent building of responses:
return response()->view('hello')->header('Content-Type', $type)
->withCookie(cookie('name', 'value'));
リダイレクトRedirects
リダイレクトのレスポンスには、ほとんどの場合Illuminate\Http\RedirectResponse
クラスのインスタンスを使用します。このクラスは、ユーザーを他のURLへリダイレクトさせるために必要な、しっかりとしたヘッダーを含んでいます。Redirect responses are typically instances of the Illuminate\Http\RedirectResponse
class, and contain the proper headers needed to redirect the user to another URL.
リダイレクトのリターンReturning A Redirect
RedirectResponse
インスタンスを生成する方法はたくさんあります。一番シンプルな方法は、redirect
ヘルパを使うことです。テストの時にリダイレクトレスポンスを生成するモックは一般的ではありませんから、ほとんどの場合、これで大丈夫でしょう。There are several ways to generate a RedirectResponse
instance. The simplest method is to use the redirect
helper method. When testing, it is not common to mock the creation of a redirect response, so using the helper method is almost always acceptable:
return redirect('user/login');
フラッシュデータ指定のリダイレクトReturning A Redirect With Flash Data
新しいURLへリダイレクトし、フラッシュデーターをセッションへ保存するのは、同時に行われるのが典型的です。ですから、利便性を上げるために、RedirectResponse
インスタンスを生成し、同時に同じメソッドチェーンで、フラッシュデーターをセッションへ保存することもできます。Redirecting to a new URL and flashing data to the session[/docs/{{version}}/session] are typically done at the same time. So, for convenience, you may create a RedirectResponse
instance and flash data to the session in a single method chain:
return redirect('user/login')->with('message', 'Login Failed');
直前のURLへのリダイレクトRedirecting To The Previous URL
直前のURLへユーザーをリダイレクトしたい場合があります。例えば、フォーム送信後です。back
メソッドで行います。You may wish to redirect the user to their previous location, for example, after a form submission. You can do so by using the back
method:
return redirect()->back();
return redirect()->back()->withInput();
名前付きルートへのリダイレクトReturning A Redirect To A Named Route
redirect
ヘルパを引数なしで呼び出すと、Illuminate\Routing\Redirector
のインスタンスが返されますので、このクラスのメソッドを呼び出すことができます。例えば、名前付きルートへのRedirectResponse
を生成したい場合は、route
メソッドを使用します。When you call the redirect
helper with no parameters, an instance of Illuminate\Routing\Redirector
is returned, allowing you to call any method on the Redirector
instance. For example, to generate a RedirectResponse
to a named route, you may use the route
method:
return redirect()->route('login');
引数指定の名前付きルートへのリダイレクトReturning A Redirect To A Named Route With Parameters
ルートに引数がある場合、route
メソッドの第2引数として指定できます。If your route has parameters, you may pass them as the second argument to the route
method.
// profile/{id}へのルート
return redirect()->route('profile', [1]);
あるルートへ"id"パラメータを伴い、Eloquentモデルを取得するルートへリダイレクトする場合、モデル自身をそのまま渡してください。IDは自動的にとり出されます。If you are redirecting to a route with an "ID" parameter that is being populated from an Eloquent model, you may simply pass the model itself. The ID will be extracted automatically:
return redirect()->route('profile', [$user]);
名前付き引数指定の名前付きルートへのリダイレクトReturning A Redirect To A Named Route Using Named Parameters
//profile/{user}へのルート
return redirect()->route('profile', ['user' => 1]);
コントローラーアクションへのリダイレクトReturning A Redirect To A Controller Action
名前付きルートへのRedirectResponse
インスタンスの生成と同様に、コントローラーアクションへのリダイレクトも生成可能です。Similarly to generating RedirectResponse
instances to named routes, you may also generate redirects to controller actions[/docs/{{version}}/controllers]:
return redirect()->action('App\Http\Controllers\HomeController@index');
注目:
URL::setRootControllerNamespace
により、コントローラーのルート名前空間が登録されていれば、完全な名前空間を指定する必要はありません。Note: You do not need to specify the full namespace to the controller if you have registered a root controller namespace viaURL::setRootControllerNamespace
.
引数指定コントローラーアクションへのリダイレクトReturning A Redirect To A Controller Action With Parameters
return redirect()->action('App\Http\Controllers\UserController@profile', [1]);
名前付き引数指定のコントローラーアクションへのリダイレクトReturning A Redirect To A Controller Action Using Named Parameters
return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);
その他のレスポンスOther Responses
response
ヘルパは、他のタイプのレスポンスインスタンスを生成するために便利です。response
ヘルパが引数なしで呼び出されると、Illuminate\Contracts\Routing\ResponseFactory
契約が返されます。この契約はレスポンスを生成するための、様々なメソッドを提供しています。The response
helper may be used to conveniently generate other types of response instances. When the response
helper is called without arguments, an implementation of the Illuminate\Contracts\Routing\ResponseFactory
contract[/docs/{{version}}/contracts] is returned. This contract provides several helpful methods for generating responses.
JSONレスポンスの生成Creating A JSON Response
json
メソッドは、Content-Type
ヘッダーに、application/json
を自動的にセットします。The json
method will automatically set the Content-Type
header to application/json
:
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
JSONPレスポンスの生成Creating A JSONP Response
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));
ファイルダウンロードレスポンスの生成Creating A File Download Response
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
return response()->download($pathToFile)->deleteFileAfterSend(true);
注意: ダウンロードを管理する、SymfonyのHttpFoundationは、ダウンロードするファイルの名前がASCIIファイル名であることを求めています。Note: Symfony HttpFoundation, which manages file downloads, requires the file being downloaded to have an ASCII file name.
レスポンスマクロResponse Macros
様々なルートとコントローラーの中で再利用するために、カスタムレスポンスを定義したい場合は、Illuminate\Contracts\Routing\ResponseFactory
の実装のmacro
メソッドを使用できます。If you would like to define a custom response that you can re-use in a variety of your routes and controllers, you may use the macro
method on an implementation of Illuminate\Contracts\Routing\ResponseFactory
.
例えば、サービスプロバイダーのboot
メソッドで定義します。For example, from a service provider's[/docs/{{version}}/providers] boot
method:
<?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
ヘルパにマクロ名を付けて呼び出した時に、実行されます。The macro
function accepts a name as its first argument, and a Closure as its second. The macro's Closure will be executed when calling the macro name from a ResponseFactory
implementation or the response
helper:
return response()->caps('foo');