HTTP Responses
Table of Contents
Creating Responses
文字列と配列
すべての routes とコントローラーは、ユーザーのブラウザに送り返すための response を返すべきです。 Laravel は、レスポンスを返すためのいくつかの異なる方法を提供します。最も基本的な response は、 route または controller から string を返すことです。フレームワークは自動的に string を完全な HTTP response に変換します:
Route::get('/', function () {
return 'Hello World';
});
routes やコントローラーから文字列を返すだけでなく、配列も返すことができます。フレームワークは自動的に array を JSON response に変換します。
Route::get('/', function () {
return [1, 2, 3];
});
NOTE
ご存知でしたか、 routes やコントローラーからもEloquent collectionsを返すことができますか?それらは自動的に JSON に変換されます。試してみてください!
Response オブジェクト
通常、あなたが route アクションから返すのは単純な文字列や配列だけではありません。代わりに、完全なIlluminate\Http\Response
インスタンスやviewsを返すことになります。
完全な Response
インスタンスを返すことで、 HTTP status code と headers をカスタマイズすることができます。Response
インスタンスは、Symfony\Component\HttpFoundation\Response
class から継承され、 HTTP responses を構築するための様々な methods を提供します:
Route::get('/home', function () {
return response('Hello World', 200)
->header('Content-Type', 'text/plain');
});
Eloquent Models と Collections
routes やコントローラーから直接 Eloquent ORM の models や collections を返すこともできます。そうすると、Laravel は自動的に models や collections を hidden attributes を考慮しながら JSON responses に変換します:
use App\Models\User;
Route::get('/user/{user}', function (User $user) {
return $user;
});
レスポンスに Headers を添付する
ほとんどの response メソッドはチェーン可能であり、response インスタンスの流暢な構築を可能にすることを覚えておいてください。例えば、header
method を使用して、ユーザーに返す前に response に一連の headers を追加できます。
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
または、 withHeaders
method を使用して、 response に追加する headers の array を指定することもできます:
return response($content)
->withHeaders([
'Content-Type' => $type,
'X-Header-One' => 'Header Value',
'X-Header-Two' => 'Header Value',
]);
Cache コントロール Middleware
Laravel には、cache.headers
middleware が含まれており、routes のグループに対して Cache-Control
header を迅速に設定するために使用できます。ディレクティブは、対応する cache-control ディレクティブの "snake case" 相当を使用して提供され、セミコロンで区切られるべきです。ディレクティブリストに etag
が指定されている場合、response content の MD5 hash が自動的に ETag 識別子として設定されます。
Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
Route::get('/privacy', function () {
// ...
});
Route::get('/terms', function () {
// ...
});
});
レスポンスにクッキーを添付する
Illuminate\Http\Response
インスタンスに cookie
method を使用して cookie を attach することができます。 method には、名前、 value 、そしてその cookie が有効とみなされる分数を渡すべきです:
return response('Hello World')->cookie(
'name', 'value', $minutes
);
cookie
method には、あまり頻繁には使用されないいくつかの追加の引数もあります。一般的に、これらの引数は PHP のネイティブ setcookie method に与えられる引数と同じ目的と意味を持ちます。
return response('Hello World')->cookie(
'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);
もし cookie が発信 response に送信されることを確認したいが、まだその response のインスタンスがない場合、cookie facade を使用して response が送信されるときに cookie を Cookie
に追加することができます。queue
method は cookie インスタンスを作成するために必要な引数を受け入れます。これらの cookie は、ブラウザに送信される前に発信 response に添付されます。
use Illuminate\Support\Facades\Cookie;
Cookie::queue('name', 'value', $minutes);
Cookie インスタンスの生成
Symfony\Component\HttpFoundation\Cookie
インスタンスを生成して、後で response インスタンスに添付したい場合は、グローバル cookie
ヘルパを使用できます。この cookie は、 response インスタンスに添付されない限り、 client unless 返送されません。
$cookie = cookie('name', 'value', $minutes);
return response('Hello World')->cookie($cookie);
クッキーの期限を早める
あなたは、出力される response のwithoutCookie
method を経由してそれを期限切れにすることで cookie を削除することができます:
return response('Hello World')->withoutCookie('name');
もしまだ送信用の response のインスタンスを持っていない場合、Cookie
ファサードのexpire
method を使用して cookie を有効期限切れにすることができます:
Cookie::expire('name');
クッキーと Encryption
default により、Illuminate\Cookie\Middleware\EncryptCookies
middleware のおかげで、 Laravel によって生成されるすべての cookies は暗号化および署名されているため、 client によって修正されたり読まれたりすることはありません。 encryption が生成する cookies の一部の暗号化を無効にしたい場合は、 application のbootstrap/app.php
ファイルの中のencryptCookies
method を使用することができます。
->withMiddleware(function (Middleware $middleware) {
$middleware->encryptCookies(except: [
'cookie_name',
]);
})
Redirects
リダイレクトレスポンスは Illuminate\\Http\\RedirectResponse
クラスの例であり、リダイレクトに必要な適切なヘッダーを含んでユーザーを別の URL にリダイレクトします。 RedirectResponse
インスタンスを生成する方法はいくつかあります。最も単純なメソッドは、グローバル redirect
ヘルパーを使用することです:
Route::get('/dashboard', function () {
return redirect('home/dashboard');
});
時には、フォームが invalid だった場合など、 user を前の場所に redirect したくなるかもしれません。その場合は、グローバルback
ヘルパー関数を使用することで実現できます。この feature はsessionを利用しているため、back
関数を呼び出す route が web
middleware グループを使用していることを確認してください。
Route::post('/user/profile', function () {
// Validate the request...
return back()->withInput();
});
名前付き Routes へのリダイレクト
redirect
ヘルパーをパラメーターなしで呼び出すと、Illuminate\\Routing\\Redirector
のインスタンスが返され、Redirector
インスタンス上で任意の method を呼び出すことができます。例えば、名前付きの route に対する RedirectResponse
を生成するには、route
の method を使用します:
return redirect()->route('login');
あなたの route がパラメータを持っている場合、それらを route
method の第二引数として渡すことができます
// For a route with the following URI: /profile/{id}
return redirect()->route('profile', ['id' => 1]);
パラメータの設定を Eloquent Models 経由で行う
Eloquent model から取得される"ID"パラメータを持つ route にリダイレクトしている場合、model 自体を渡すことができます。ID は自動的に抽出されます。
// For a route with the following URI: /profile/{id}
return redirect()->route('profile', [$user]);
value をカスタマイズしたい場合、 route パラメーターに配置する値を指定するために column を route パラメーター定義(/profile/{id:slug}
)で指定するか、またはgetRouteKey
method をあなたの Eloquent model でオーバーライドできます。
/**
* Get the value of the model's route key.
*/
public function getRouteKey(): mixed
{
return $this->slug;
}
Controller アクションへのリダイレクト
また、controller アクションへのリダイレクトを生成することも可能です。そのためには、 controller 及び action の名前を action
method に渡します:
use App\Http\Controllers\UserController;
return redirect()->action([UserController::class, 'index']);
もし、あなたの controller route がパラメータを必要とする場合、それらをaction
method の第二引数として渡すことができます:
return redirect()->action(
[UserController::class, 'profile'], ['id' => 1]
);
外部ドメインへのリダイレクト
時には、あなたの application の外部の domain に redirect する必要があるかもしれません。そのような場合には、追加の URL エンコーディング、 validation 、または確認なしにRedirectResponse
を作成するaway
method を呼び出すことができます。
return redirect()->away('https://www.google.com');
フラッシュされた Session Data を使用してリダイレクト
新しい URL へのリダイレクトとセッションへのデータのフラッシュは通常、同時に行われます。これは通常、成功メッセージをセッションにフラッシュする際に、アクションの成功後に行われます。便宜上、RedirectResponse
インスタンスを作成して、1 つの流れるようなメソッドチェーンでデータをセッションにフラッシュすることも可能です:
Route::post('/user/profile', function () {
// ...
return redirect('dashboard')->with('status', 'Profile updated!');
});
user がリダイレクトされた後、sessionからフラッシュメッセージを表示することができます。例えば、Blade syntaxを使用してください:
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
Input を用いたリダイレクト
RedirectResponse
インスタンスによって提供される withInput
method を利用して、新しい場所に user を redirect する前に、現在のリクエストの入力 data を session にフラッシュすることができます。これは一般的に、user が validationerror に遭遇した場合に行われます。入力が session にフラッシュされた後、次の request の際に簡単にそれを取り出すことが出来、フォームに再度読み込むことが出来ます:
return back()->withInput();
Other Response Types
response
ヘルパーは、他のタイプの'' response ''インスタンスを生成するために使用できます。 response
ヘルパーが引数なしで呼び出されると、Illuminate\Contracts\Routing\ResponseFactory
contractの実装が返されます。 この契約は、レスポンスを生成するためのいくつかの便利なメソッドを提供します。
View のレスポンス
レスポンスの status や headers をコントロールする必要があり、さらにレスポンスの content としてviewを返す必要がある場合は、view
method を使用するべきです。
return response()
->view('hello', $data, 200)
->header('Content-Type', $type);
もちろん、 custom HTTP status code や custom headers を渡す必要がない場合は、グローバルな view
ヘルパー関数を使用することができます。
JSON Responses
json
method は、自動的に Content-Type
header を application/json
に設定し、指定された array を PHP の json_encode
関数を使用して JSON に変換します。
return response()->json([
'name' => 'Abigail',
'state' => 'CA',
]);
JSONP response を作成したい場合は、json
method を withCallback
method と組み合わせて使用できます。
return response()
->json(['name' => 'Abigail', 'state' => 'CA'])
->withCallback($request->input('callback'));
ファイルダウンロード
download
メソッドは、指定されたパスのファイルをダウンロードするようにユーザーのブラウザに強制するレスポンスを生成するために使用できます。download
メソッドは、メソッドの第二引数としてファイル名を受け付けます。これは、ファイルをダウンロードするユーザーが見るファイル名を決定します。最後に、メソッドの第三引数として HTTP ヘッダーの配列を渡すこともできます:
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
WARNING
Symfony HttpFoundation は、ファイルのダウンロードを管理するために、ダウンロードされるファイルが ASCII ファイル名を持つことを必要とします。
ストリームダウンロード
時には、特定の操作の string response をディスクに操作の内容を書き込むことなく、ダウンロード可能な response に変えたい場合があるかもしれません。そのような場合、streamDownload
method を使用できます。この method は、コールバック、ファイル名、およびオプションの array と headers を引数として受け取ります。
use App\Services\GitHub;
return response()->streamDownload(function () {
echo GitHub::api('repo')
->contents()
->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');
ファイルのレスポンス
file
method は、 download を開始する代わりに、user のブラウザで直接ファイル( image や PDF など)を表示するために使用できます。この method は、最初の引数としてファイルへの絶対的な path を、2 番目の引数として headers の array を受け取ります:
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
Response Macros
もし custom response を定義し、それを様々な routes やコントローラで再利用したい場合、Response
facade 上のmacro
method を使用できます。通常、この method はboot
method から呼び出すべきで、お使いのアプリケーションのservice providersの中の 1 つ、例えばApp\Providers\AppServiceProvider
service provider から呼び出すことが一般的です:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Response::macro('caps', function (string $value) {
return Response::make(strtoupper($value));
});
}
}
macro
関数は、最初の引数として名前を、2 番目の引数としてクロージャを受け入れます。マクロのクロージャは、ResponseFactory
実装またはresponse
ヘルパーから macro 名を呼び出すときに実行されます。
return response()->caps('foo');