サイトアイコン 上尾市のWEBプログラマーによるブログ

「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の先頭にミドルウェアを登録する。
(先頭に登録されたミドルウェアは、レスポンスでは最後に実行される)

デフォルトで用意されているミドルウェア

グローバルミドルウェア

ルートミドルウェア

ミドルウェアグループのweb

独自ミドルウェアの実装

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,
    // 以下省略
モバイルバージョンを終了