レスポンス
ヘルパー関数とResponseファサード
レスポンスの返却は、ヘルパー関数またはResponseファサードを使う。
ヘルパー関数
通常はviewヘルパー関数でテンプレートを出力する。
return view('home');
responseヘルパー関数で文字列、JSON、JSONPなどを返却することができる。
return response('Hello'); // Content-Type: text/html
return response('Hello', \Illuminate\Http\Response::HTTP_OK, ['content-type' => 'text/plain']);
return response()->json(['status' => 'success']); // Content-Type: application/json
return response()->jsonp('callback', ['status' => 'success']); // Content-Type: text/javascript
Responseファサード
実体はIlluminate\Contracts\Routing\ResponseFactoryクラスであり、ファクトリークラスであるため呼び出すメソッドによって生成されるResponseクラスが異なる。
return \Response::view('home');
return \Response::make('Hello'); // Content-Type: text/html
return \Response::make('Hello', \Illuminate\Http\Response::HTTP_OK, ['content-type' => 'text/plain']);
return \Response::json(['status' => 'success']); // Content-Type: application/json
return \Response::jsonp('callback',['status' => 'success']); // Content-Type: text/javascript
ダウンロードレスポンス
// responseヘルパー関数
return response()->download(resource_path('assets/js/bootstrap.js'));
// Responseファサード
return \Response::download(resource_path('assets/js/bootstrap.js'));
リダイレクトレスポンス
// redirectヘルパー関数
return redirect('/');
// responseヘルパー関数
return response()->redirectTo('/');
// Responseファサード
return \Response::redirectTo('/');
リクエストパラメータをそのまま渡したい場合はwithInputメソッドを使う。return redirect('/')->withInput();
セッションに値が保存され、リダイレクト先では$request->old('xxx')
やold('xxx')
で取得可能。
一回だけ表示できるフラッシュデータを渡す場合はwithメソッドを使う。return redirect('/')->with('success_msg', '登録完了しました');
取得方法はwithInputと同じ。
SSE(Server Sent Event)
SSEはHTML5で追加された機能で、サーバからデータをプッシュすることができる。
WebSocketとは異なり、HTTPプロトコルを使っている。
Laravelではストリームレスポンスを利用して実装することができる。
return response()->stream(function() {
while(true) {
echo 'data: ' . rand(1, 100) . "\n\n";
ob_flush();
flush();
usleep(200000);
}
}, Reqponse::HTTP:OK, [
'content-type' => 'text/event-stream',
'X-Accel-Buffering' => 'no',
'Cache-Control' => 'no-cache',
]);
APIリソース
APIリソースとは、bladeのJSON版のようなものである。
モデルをREST APIのレスポンスとして返す場合、コントローラでモデルのCollectionやインスタンスを返すことでレスポンスはJSON形式となる。
しかし、時刻のフォーマットを変換したいなど、モデルのプロパティを変形してからJSONのレスポンスとして返したいこともある。
その場合は、APIリソースを使うと便利である。
php artisan make:resource UserResource
class UserResource extends Resource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
];
}
}
// 利用時
return new UserResource(User::find(1));
return UserResource::collection(User::all());
ミドルウェア
ミドルウェアとは
コントローラのアクションメソッド前後に処理を実行させるための仕組み。
リクエストは以下の順番で処理される(レスポンスは逆)
- グローバルミドルウェア
システム全体で使用するミドルウェア。 - ルートミドルウェア
特定のルートで使用するミドルウェア。
利用するミドルウェアはApp\Http\Kernelで登録されている。
- グローバルミドルウェア: $middleware
- ルートミドルウェア: $routeMiddleware
- ミドルウェアグループ: $middlewareGroups
ミドルウェアグループにはデフォルトでwebとapiが登録されている。
ミドルウェアグループを適用する処理がApp\Providers\RouteServiceProviderに記述されているため、変更したい場合はRouteServiceProviderを修正する。
登録した順番で実行されるため、順番は重要である。
例えば、全てのミドルウェアの処理が完了した最終的なレスポンスに対しての処理を行いたい場合は、$middlewareの先頭にミドルウェアを登録する。
(先頭に登録されたミドルウェアは、レスポンスでは最後に実行される)
デフォルトで用意されているミドルウェア
グローバルミドルウェア
- \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode
メンテナンス画面の表示。 - \Illuminate\Foundation\Http\Middleware\ValidatePostSize
リクエストボディのサイズチェック。 - \App\Http\Middleware\TrimStrings
リクエストパラメータのtrim処理。
except配列で除外したいパラメータ名を指定可能。 - \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull
リクエストパラメータの空文字をNullに変換。 - \App\Http\Middleware\TrustProxies
ロードバランサ使用時に、HTTPでのリクエストの場合でもHTTPSのリンクを生成する。
(proxies配列にロードバランサのIPを追加する必要あり)
ルートミドルウェア
- auth: \Illuminate\Auth\Middleware\Authenticate
認証済みかチェック。 - auth.basic: \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth
ベーシック認証。 - bindings: \Illuminate\Routing\Middleware\SubstituteBindings
モデル結合ルートの有効化。 - can: \Illuminate\Auth\Middleware\Authorize
認可。(権限チェック) - guest: \App\Http\Middleware\RedirectIfAuthenticated
認証済みの場合に/homeにリダイレクト。(ゲスト用ページに使う) - throttle: \Illuminate\Routing\Middleware\ThrottleRequests
同一ユーザーの単位時間内アクセス回数制限。
ミドルウェアグループのweb
- \Illuminate\Cookie\Middleware\EncryptCookies
クッキーの暗号化複合化。 - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse
Cookie::queueで登録した値をレスポンスにクッキーとして追加。 - \Illuminate\Session\Middleware\StartSession
セッションの有効化。 - \Illuminate\Session\Middleware\AuthenticateSession
パスワード変更時にログイン中の対象ユーザーをログアウトさせる。
(デフォルトではコメントアウトされている) - \Illuminate\View\Middleware\ShareErrorsFromSession
bladeの$errorsにセッションerrorsの内容をセットする。 - \App\Http\Middleware\VerifyCsrfToken
CSRF対策用トークンのチェック。 - \Illuminate\Routing\Middleware\SubstituteBindings
モデル結合ルートの有効化。
独自ミドルウェアの実装
1. php artisan make:middleware Xxxでミドルウェアを生成
php artisan make:middleware HogeLogger
2. handleメソッド内の$next($request);の前後に「コントローラのアクションメソッドの前後に実行したい処理」を実装する。
public function handle($request, Closure $next)
{
// アクションメソッドの前にログを出力
info('before action');
$response = $next($request);
// アクションメソッドの後にログを出力
info('after action');
return $response;
}
3. App\Http\Kernelに登録
protected $middleware = [
\App\Http\Middleware\HogeLogger::class,
// 以下省略
コメント