メインコンテンツまでスキップ

HTTP レスポンス

レスポンスの作成

文字列と配列

すべてのルートとコントローラーは、ユーザーのブラウザに返されるレスポンスを返す必要があります。Laravel では、さまざまな方法でレスポンスを返すことができます。最も基本的なレスポンスは、ルートまたはコントローラーから文字列を返すことです。フレームワークは自動的に文字列を完全な HTTP レスポンスに変換します:

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

ルートやコントローラーから文字列を返すだけでなく、配列を返すこともできます。フレームワークは自動的に配列を JSON レスポンスに変換します:

    Route::get('/', function () {
return [1, 2, 3];
});

注記

Eloquent コレクションをルートやコントローラーから返すこともできることを知っていましたか?これらは自動的に JSON に変換されます。試してみてください!

レスポンスオブジェクト

通常、ルートアクションからは単純な文字列や配列を返すだけではありません。代わりに、完全な Illuminate\Http\Response インスタンスやビューを返します。

完全な Response インスタンスを返すことで、レスポンスの HTTP ステータスコードやヘッダーをカスタマイズすることができます。Response インスタンスは Symfony\Component\HttpFoundation\Response クラスを継承しており、さまざまな HTTP レスポンスを構築するためのメソッドが提供されています。

    Route::get('/home', function () {
return response('Hello World', 200)
->header('Content-Type', 'text/plain');
});

Eloquent Models and Collections

ルートやコントローラからEloquent ORMモデルやコレクションを直接返すこともできます。これを行うと、Laravelはモデルとコレクションを自動的にJSONレスポンスに変換しますが、モデルの非表示属性を尊重します。

    use App\Models\User;

Route::get('/user/{user}', function (User $user) {
return $user;
});

レスポンスにヘッダを添付する

ほとんどのレスポンスメソッドはチェーン可能であり、レスポンスインスタンスを流暢に構築することができます。たとえば、ユーザーに返す前にレスポンスに一連のヘッダを追加するために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',
]);

キャッシュ制御ミドルウェア

Laravelにはcache.headersミドルウェアが含まれており、一連のルートにCache-Controlヘッダを迅速に設定するために使用できます。ディレクティブは、対応するキャッシュ制御ディレクティブの「スネークケース」相当を使用して提供する必要があり、セミコロンで区切られている必要があります。ディレクティブのリストにetagが指定されている場合、レスポンスコンテンツのMD5ハッシュが自動的にETag識別子として設定されます。

    Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
Route::get('/privacy', function () {
// ...
});

Route::get('/terms', function () {
// ...
});
});

レスポンスにクッキーを添付する

Illuminate\Http\Responseインスタンスにクッキーを添付するには、cookieメソッドを使用します。このメソッドには、クッキーの名前、値、およびクッキーが有効と見なされる分数を渡す必要があります。

    return response('Hello World')->cookie(
'name', 'value', $minutes
);

cookieメソッドは、一般的にはあまり頻繁に使用されないいくつかの引数も受け入れます。一般的に、これらの引数は、PHPのネイティブなsetcookieメソッドに与えられる引数と同じ目的と意味を持っています。

    return response('Hello World')->cookie(
'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);

レスポンスと一緒にクッキーを送信したいが、まだそのレスポンスのインスタンスがない場合は、Cookieファサードを使用して、レスポンスが送信されるときにクッキーを「キュー」に入れることができます。queueメソッドは、クッキーインスタンスを作成するために必要な引数を受け入れます。これらのクッキーは、ブラウザに送信される前に、送信されるレスポンスに添付されます:

    use Illuminate\Support\Facades\Cookie;

Cookie::queue('name', 'value', $minutes);

クッキーインスタンスの生成

後でレスポンスインスタンスに添付できるSymfony\Component\HttpFoundation\Cookieインスタンスを生成したい場合は、グローバルなcookieヘルパーを使用できます。このクッキーは、レスポンスインスタンスに添付されていない限り、クライアントに送信されません:

    $cookie = cookie('name', 'value', $minutes);

return response('Hello World')->cookie($cookie);

早期にクッキーを期限切れにする

送信されるレスポンスのwithoutCookieメソッドを使用して、クッキーを期限切れにすることで、クッキーを削除することができます:

    return response('Hello World')->withoutCookie('name');

まだ送信されるレスポンスのインスタンスがない場合は、Cookieファサードのexpireメソッドを使用してクッキーを期限切れにすることができます:

    Cookie::expire('name');

クッキーと暗号化

デフォルトでは、Illuminate\Cookie\Middleware\EncryptCookiesミドルウェアのおかげで、Laravelによって生成されるすべてのクッキーは暗号化され、署名されているため、クライアントによって変更または読み取られることはありません。アプリケーションで生成されるクッキーの一部の暗号化を無効にしたい場合は、アプリケーションのbootstrap/app.phpファイルでencryptCookiesメソッドを使用できます:

    ->withMiddleware(function (Middleware $middleware) {
$middleware->encryptCookies(except: [
'cookie_name',
]);
})

リダイレクト

リダイレクトレスポンスはIlluminate\Http\RedirectResponseクラスのインスタンスであり、ユーザーを別のURLにリダイレクトするために必要な適切なヘッダーを含んでいます。RedirectResponseインスタンスを生成する方法はいくつかあります。最も簡単な方法は、グローバルなredirectヘルパーを使用することです:

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

時には、ユーザーを前の場所にリダイレクトしたい場合があります。たとえば、送信されたフォームが無効な場合などです。このような場合は、グローバルなbackヘルパー関数を使用して行うことができます。この機能はセッションを利用しているため、back関数を呼び出すルートがwebミドルウェアグループを使用していることを確認してください:

    Route::post('/user/profile', function () {
// Validate the request...

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

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

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

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

もしルートにパラメータがある場合は、route メソッドの第2引数としてそれらを渡すことができます:

    // For a route with the following URI: /profile/{id}

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

Eloquent モデルを介したパラメータの設定

Eloquent モデルから取得される "ID" パラメータを持つルートにリダイレクトする場合は、モデル自体を渡すことができます。ID は自動的に抽出されます:

    // For a route with the following URI: /profile/{id}

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

ルートパラメータに配置される値をカスタマイズしたい場合は、ルートパラメータの定義 (/profile/{id:slug}) でカラムを指定するか、Eloquent モデルで getRouteKey メソッドをオーバーライドすることができます:

    /**
* Get the value of the model's route key.
*/
public function getRouteKey(): mixed
{
return $this->slug;
}

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

コントローラーアクション へのリダイレクトも生成することができます。そのためには、action メソッドにコントローラーとアクション名を渡します:

    use App\Http\Controllers\UserController;

return redirect()->action([UserController::class, 'index']);

コントローラーのルートにパラメータが必要な場合は、action メソッドの第2引数としてそれらを渡すことができます:

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

外部ドメインへのリダイレクト

アプリケーション外のドメインにリダイレクトする必要がある場合があります。その場合は、URL エンコード、検証、確認を行わずに RedirectResponse を作成する away メソッドを呼び出すことで行うことができます:

    return redirect()->away('https://www.google.com');

フラッシュセッションデータを使用したリダイレクト

新しい 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

入力を使用したリダイレクト

ユーザーを新しい場所にリダイレクトする前に、RedirectResponse インスタンスが提供する withInput メソッドを使用して、現在のリクエストの入力データをセッションにフラッシュすることができます。これは通常、ユーザーが検証エラーに遭遇した場合に行われます。入力がセッションにフラッシュされたら、次のリクエスト中にそれを簡単に取得してフォームを再表示できます:

    return back()->withInput();

その他のレスポンスタイプ

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

ビューレスポンス

レスポンスのステータスとヘッダーを制御する必要があるが、レスポンスのコンテンツとしてビューを返す必要がある場合は、view メソッドを使用する必要があります:

    return response()
->view('hello', $data, 200)
->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 メソッドを withCallback メソッドと組み合わせて使用できます:

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

ファイルのダウンロード

download メソッドを使用して、ユーザーのブラウザーにファイルをダウンロードさせるレスポンスを生成できます。download メソッドは、ファイル名をメソッドの第二引数として受け入れます。これにより、ファイルをダウンロードするユーザーが見るファイル名が決まります。最後に、メソッドの第三引数としてHTTPヘッダーの配列を渡すことができます:

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

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

警告

Symfony HttpFoundation、ファイルのダウンロードを管理するものは、ダウンロードされるファイルがASCIIファイル名を持っている必要があります。

ストリームダウンロード

特定の操作の文字列応答をディスクに書き込むことなく、ダウンロード可能な応答に変換したい場合があります。この場合、streamDownload メソッドを使用できます。このメソッドは、コールバック、ファイル名、およびオプションのヘッダー配列を引数として受け入れます:

    use App\Services\GitHub;

return response()->streamDownload(function () {
echo GitHub::api('repo')
->contents()
->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');

ファイル応答

file メソッドは、画像やPDFなどのファイルを、ダウンロードを開始するのではなく、ユーザーのブラウザーで直接表示するために使用できます。このメソッドは、ファイルへの絶対パスを最初の引数として、ヘッダーの配列を第二引数として受け入れます:

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

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

応答マクロ

複数のルートやコントローラーで再利用できるカスタム応答を定義したい場合は、Response ファサードの macro メソッドを使用できます。通常、このメソッドは、App\Providers\AppServiceProvider サービスプロバイダーなど、アプリケーションのサービスプロバイダーboot メソッドから呼び出すべきです:

    <?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 関数は、最初の引数として名前、第二引数としてクロージャを受け入れます。マクロのクロージャは、ResponseFactory の実装または response ヘルパーからマクロ名を呼び出すときに実行されます:

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