応答
- 応答オブジェクト
- 応答ヘッダーの追加
- キャッシュ制御ミドルウェア
- 応答に Cookie を追加
- Cookies & 暗号化
- リダイレクト
- 名前付きルートにリダイレクト
- Eloquent モデル パラメーターを介して入力
- ##コントローラー アクションにジャンプ
- ##外部ドメイン名にジャンプ #送信されたセッション値でジャンプ
- ##応答の表示
- #JSON レスポンス
- ファイルのダウンロード
- ストリームのダウンロード
- ファイル応答
- 応答マクロ
HTTP レスポンス
## 応答の作成String & Arrayすべてのルートとコントローラーは、ビジネス ロジックの処理後にユーザーのブラウザに送信された応答を返します。Laravel では、応答を返すさまざまな方法が提供されています。最も基本的な応答は、ルートまたはコントローラーから単純な文字列を返すことです。フレームワークは、この文字列を完全な HTTP 応答に自動的に変換します:
Route::get('/', function () { return 'Hello World'; });
ルートまたはコントローラーから応答を返すことに加えて、文字列のほか、コントローラーは配列を返すこともできます。フレームワークは配列を JSON レスポンスに自動的に変換します:
Route::get('/', function () { return [1, 2, 3]; });
{tip} ルートやコントローラーから Eloquent コレクションを返すこともできることをご存知ですか?また、JSON 応答にも自動的に変換されます。応答オブジェクト通常、ルーティング アクションから単に文字列と配列を返すだけではなく、ほとんどの場合、完全な
Illuminate\ Http\Responseインスタンスまたはビュー。
Response完全な
インスタンスを返します。これにより、応答の HTTP ステータス コードと応答ヘッダー情報をカスタマイズできます。
Response
インスタンスは、HTTP レスポンスを構築するためのさまざまなメソッドを提供するSymfony\Component\HttpFoundation\Response
クラスを継承します。Route::get('home', function () { return response('Hello World', 200) ->header('Content-Type', 'text/plain'); });
応答ヘッダーの追加ほとんどの応答メソッドはチェーン可能であり、応答インスタンスを作成するプロセスがより読みやすくなります。たとえば、
headerメソッドを使用して、応答がユーザーに返される前に一連のヘッダー情報を応答に追加できます。
withHeaders メソッドを使用することもできます。
あるいは、return response($content) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
応答に追加するヘッダーの配列を指定するメソッド:
return response($content) ->withHeaders([ 'Content-Type' => $type, 'X-Header-One' => 'Header Value', 'X-Header-Two' => 'Header Value', ]);
キャッシュ制御ミドルウェア
Laravelには、ルーティンググループの
Cache-Control
ヘッダー情報を素早く設定するために使用できる組み込みのcache.headers
ミドルウェアがあります。etag
がディレクティブセットで宣言されている場合、Laravel は ETag 識別子を応答コンテンツの MD5 ハッシュに自動的に設定します:Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function() { Route::get('privacy', function () { // ... }); Route::get('terms', function () { // ... }); });
応答への Cookie の追加
応答の
cookie
メソッドを使用して、応答に Cookie を簡単に追加できます。たとえば、次のようにcookie
メソッドを使用して Cookie を生成し、それを応答に簡単に添付できます。return response($content) ->header('Content-Type', $type) ->cookie('name', 'value', $minutes);
cookie
メソッドは、使用頻度の低いいくつかのメソッドも受け入れます。パラメーター。一般に、これらのパラメータは、ネイティブ PHP setcookie メソッドのパラメータと同じ目的と意味を持ちます。->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
あるいは、
Cookie
ファサード "queue"、Cookie# を使用することもできます。 ## アプリケーションの送信応答に添付されます。
queueメソッドは、
Cookieインスタンス、または
Cookieインスタンスの作成に必要なパラメーターを受け入れます。これらの Cookie は、ブラウザに送信される前に発信応答に追加されます:
Cookie::queue(Cookie::make('name', 'value', $minutes)); Cookie::queue('name', 'value', $minutes);
Cookies & Encryption Byデフォルトでは、Laravel によって生成されるすべての Cookie は暗号化および署名されるため、クライアントが変更したり読み取ったりすることはできません。アプリケーションによって生成された一部の Cookie を暗号化したくない場合は、app/Http/Middleware
ディレクトリにある
App\Http\Middleware\EncryptCookiesミドルウェアを使用できます。 ## プロパティ:
/** * 不需要被加密的cookies名称 * * @var array */ protected $except = [ 'cookie_name', ];
リダイレクトリダイレクト応答は
Illuminate\Http \ のインスタンスRedirectResponse
クラスには、ユーザーを別の URL にリダイレクトするために必要なヘッダー情報が含まれています。 Laravel には、RedirectResponse
インスタンスを生成するためのメソッドがいくつか用意されています。最も簡単な方法は、グローバル ヘルパー関数
redirect:
Route::get('dashboard', function () { return redirect('home/dashboard'); });
を使用することです。送信されたフォームが無効な場合など、ユーザーを前の場所にリダイレクトしたい場合があります。現時点では、グローバル ヘルパー関数
back を使用してこの操作を実行できます。この機能はセッション制御を利用するため、back
関数を呼び出すルートが
webミドルウェア グループまたはすべてのセッション ミドルウェアを使用していることを確認してください:
Route::post('user/profile', function () { //验证请求 return back()->withInput(); });
名前付きルートへのリダイレクト
ヘルパー関数
redirect
をパラメーターなしで呼び出すと、Illuminate\Routing\Redirector
インスタンスが返されます。このインスタンスにより、Redirector
上の任意のメソッドを呼び出すことができます。たとえば、名前付きルートのRedirectResponse
を生成するには、route
メソッドを使用します。return redirect()->route('login');
ルートにパラメータがある場合は、それらを渡すことができます。
ルート
の 2 番目のパラメータとしてメソッド:// 对于具有以下 URI 的路由: profile/{id} return redirect()->route('profile', ['id' => 1]);
Eloquent モデルを通じてパラメータを入力します。
次のルートにリダイレクトする場合は、 Eloquent モデルから「ID」パラメータを入力した場合は、モデル自体を渡すだけで済みます。 ID は自動的に抽出されます:
//对于具有以下 URI 的路由: profile/{id} return redirect()->route('profile', [$user]);
このルート パラメーターのデフォルトのパラメーター名をカスタマイズする場合は、モデル インスタンスの
getRouteKey
メソッドをオーバーライドする必要があります:/** * 获取模型的路由键 * * @return mixed */ public function getRouteKey(){ return $this->slug; }
コントローラー アクションへのジャンプ
コントローラーへのジャンプ アクションを生成することもできます。これを行うには、コントローラーの名前とアクションを
action
メソッドに渡すだけです。コントローラーの完全な名前空間を渡す必要はないことに注意してください。Laravel のRouteServiceProvider
は、それをベース コントローラーの名前空間に自動的に設定します:return redirect()->action('HomeController@index');
コントローラー ルートにパラメーターが必要な場合は、これを
action
メソッドの 2 番目のパラメータとして使用できます:return redirect()->action( 'UserController@profile', ['id' => 1] );
外部ドメイン名にジャンプ
アプリケーションの外部のドメイン名にジャンプする必要がある場合があります。これは、
新しい URL にジャンプし、同時にデータをセッションに転送することは非常に一般的です。これは通常、アクションが正常に実行され、セッションにメッセージが送信された後に行われます。便宜上、away
メソッドを呼び出すことで実現されます。このメソッドは、追加の URL エンコードや有効性チェックサム チェックを行わずに、RedirectResponse
インスタンスを作成します。RedirectResponseインスタンスを作成し、チェーン メソッド呼び出しでデータをセッションに転送できます。
ユーザーがジャンプした後、セッション内に転送されたデータを表示できます。たとえば、Blade 構文を使用します。return redirect()->away('https://www.google.com');
Route::post('user/profile', function () { // Update the user's profile... return redirect('dashboard')->with('status', 'Profile updated!'); });
responseアシスタントは次のことを行うことができます。他のタイプの応答インスタンスを生成するために使用されます。response
ヘルパーもパラメーターを指定して呼び出された場合、Illuminate\Contracts\Routing\ResponseFactory
コントラクトの実装が返されます。このコントラクトは、応答を生成するためのいくつかのメソッドを提供します:
View 応答
ビューを応答コンテンツとして返し、応答ステータスとヘッダー情報を制御する必要がある場合は、
view
メソッドを呼び出す必要があります:@if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif
そうでない場合は、カスタム HTTP ステータス コードとカスタム ヘッダー情報を渡す必要があります。また、グローバル
view
ヘルパー関数を使用することもできます。##JSON 応答jsonは自動的に
withCallbackContent-Type
を変更します。ヘッダー情報はapplication/json
に設定され、指定された配列は PHP のjson_encode
関数を使用して JSON に変換されます。
JSONP 応答を作成する場合は、return response() ->view('hello', $data, 200) ->header('Content-Type', $type);
メソッドと組み合わせて、
#File downloadjson
メソッドを使用できます:return response()->json([ 'name' => 'Abigail', 'state' => 'CA' ]);
download
メソッドを使用すると、ユーザーのブラウザに指定されたパスにファイルをダウンロードさせる応答を生成できます。download
メソッドのファイル名は 2 番目のパラメータとして使用され、ユーザーがダウンロードするファイルのファイル名として使用されます。最後に、HTTP ヘッダーの配列を 3 番目のパラメーターとして渡すことができます。
return response() ->json(['name' => 'Abigail', 'state' => 'CA']) ->withCallback($request->input('callback'));
{note} ファイルのダウンロードの管理に使用される Symfony HttpFoundation では、ダウンロードされたファイルに ASCII ファイル名が付いている必要があります。
ストリーミング ダウンロード 特定の操作の文字列応答を、ディスクに書き込まずにダウンロード応答に変換したい場合があります。現時点では、
streamDownload
メソッドを使用できます。このメソッドは、コールバック、ファイル名、およびオプションのヘッダー配列をパラメータとして受け取ります。return response()->download($pathToFile); return response()->download($pathToFile, $name, $headers); return response()->download($pathToFile)->deleteFileAfterSend();
このメソッドは、画像や PDF などのファイルをダウンロードするのではなく、ユーザーのブラウザーに直接表示するために使用されます。このメソッドは、最初のパラメータとしてファイル パスを、2 番目のパラメータとしてヘッダー情報配列を受け入れます。
return response()->streamDownload(function () { echo GitHub::api('repo') ->contents() ->readme('laravel', 'laravel')['contents']; }, 'laravel-readme.md');
複数のルートおよびコントローラーで再利用できるカスタム応答を定義する場合は、Responseファサードで
macroメソッドを使用できます。たとえば、サービス プロバイダーの
ResponseFactoryboot
メソッドに次のコードを記述します。return response()->file($pathToFile); return response()->file($pathToFile, $headers);
macro
このメソッドは、名前を最初のパラメータとして受け入れ、クロージャ関数を受け入れます。 2 番目のパラメータとして。応答マクロのクロージャは、マクロ名が実装クラスまたはヘルパー関数
response
:
で呼び出されたときに実行されます。この記事は # で最初に公開されました。 ##LearnKu.com<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Response; class ResponseMacroServiceProvider extends ServiceProvider{ /** * 注册应用程序的响应宏 * * @return void */ public function boot() { Response::macro('caps', function ($value) { return Response::make(strtoupper($value)); }); } }
のウェブサイトをご覧ください。