「PHPフレームワーク Laravel Webアプリケーション開発」の感想・備忘録6

スポンサーリンク

レスポンス

ヘルパー関数と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());

ミドルウェア

ミドルウェアとは

コントローラのアクションメソッド前後に処理を実行させるための仕組み。
リクエストは以下の順番で処理される(レスポンスは逆)

  1. グローバルミドルウェア
    システム全体で使用するミドルウェア。
  2. ルートミドルウェア
    特定のルートで使用するミドルウェア。

利用するミドルウェアは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,
    // 以下省略

コメント