【PHP】HTTPレスポンス処理【Laravel】
PHPでHTTPリクエストの中身を抽出したり、レスポンスでファイルをダウンロードするなどの処理を取扱いうことがあります。
PHPで作り込むこともできますが、面倒くさがりさんはフレームワークを使ってサクッと実装しましょう。ということで、今回はHTTPリクエスト・レスポンス処理についての機能を整理しています。
LaravelがSymfonyというフレームワークをベースにしていますので、ドキュメントもSymfonyのサイトを参考にしてみるといいでしょう。
Laravel 8で動作を確認しています。7以前のバージョンでもほとんど動きます。
ファイルをダウンロードさせる
一番利用用途が多いかもしれません。CSVなどのファイルをユーザにダウンロードしてもらうときに利用します。Laravelのコントローラではそのまま利用できるはず。
return response()->download($pathToFile)
$pathToFileの部分にはダウンロードさせるファイルへのパスを渡します。たったこれだけでダウンロード処理が完成です。
ファイルダウンロード後に該当ファイルを削除したい
コントローラでファイルをレスポンスしているから、レスポンス処理後にファイル削除できないじゃんと思っていたら、ちゃんと機能が提供されていました。
return response()->download($pathToFile)->deleteFileAfterSend(true);
deleteFileAfterSendを使うと、ダウンロード処理完了後に該当ファイルを削除します。色々悩んでいたらこの機能に辿り着きました。ググり力大事。
falseを指定するとファイルを削除しないことを明示できます。
リクエストからアクセス先パスを取得
$request->getPathInfo()
出力結果サンプル
string "/admin/user"
どこに向けてのリクエストかを取得できます。
リクエストヘッダからパラメータ取得
$request->headers->get('Accept')
出力結果サンプル
string "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
getの部分でキーを取得することで、リクエストヘッダのパラメータを取得できます。リクエストヘッダにロジックに必要なパラメータを含んでいる場合はこちらを利用するといいでしょう。
レスポンス作成
ここからレスポンスに関する機能になります。レスポンスはボディもヘッダも個々に作成していくこともできます。
return response($content) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
ブラウザにcookieを渡して制御を行いたい場合はこのような記述を行います。
return response('レスポンスするコンテンツ')->cookie( 'fruits', 'apple', 10 );
設定している値は下記の通りです。
cookieのkey | fruits |
cookieのvalue | apple |
cookie有効期限(分) | 10 |
設定したcookieの値を取得するには、HTTPリクエストから取得します。
$request->cookie('fruits')
正しくcookieが設定されていれば、「apple」という文字列が取得できます。
cookieはIlluminate\Http\Responseインスタンスを利用していればそのまま設定できますので、そんな書き方もできます。
$error = new MessageBag([ 'title' => 'エラーが発生いたしました', ]); return back()->withInput()->with(compact('error'))->cookie( 'error_lock', 'lock_message', 10 );
エラーが発生したら10分間有効な「error_lock」というcookieを発行しています。例えば、エラー発生したら一定期間ブラウザからの操作をロックしたい場合に利用できます。
cookieの有効期限が切れるかcookieが消されると再度利用できるようになる仕組みですね。
Cache-Controlを設定する
コンテンツによってはブラウザにキャッシュさせたくないものもあります。その場合はCache-Controlを利用して、ブラウザ側に「このコンテンツはキャッシュしないでね!」と教えてあげる必要があります。
$response->setCache([ 'no_cache' => true, ]);
これでno_chacheを設定することができます。
他にもCache-Controlで利用できるものありますが、必要なものだけ設定すれば問題ありません。
$response->setCache([ 'must_revalidate' => false, 'no_cache' => false, 'no_store' => false, 'no_transform' => false, 'public' => true, 'private' => false, 'proxy_revalidate' => false, 'max_age' => 600, 's_maxage' => 600, 'immutable' => true, 'last_modified' => new \DateTime(), 'etag' => 'abcdef', ]);
レスポンスでリダイレクト先指定
よく使われるのはエラー画面ですかね。ユーザのリクエストとは別のページに遷移させたい場合に、ブラウザへリダイレクトを指示したい場合に使います。
use Illuminate\Http\RedirectResponse; $response = new RedirectResponse('http://example.com/',302);
第二引数の部分を省略した場合はデフォルトの302(Moved Temporarily)が設定されます。301(Permanent Redirect)を指定したい場合は、第二引数に301を設定します。
リダイレクトが設定されると、ユーザがどのページにリクエストをしてこようが「http://example.com/」にリダイレクトされます。
APIでjsonをレスポンス
Content-Typeヘッダプロパティに「application/json」も付与されるので便利です。
return response()->json([ 'category' => 'fruits', 'name' => 'apple', ]);
application/jsonが付与されていれば、inpudプロパティでjson配列の要素にアクセスできます。
$name = $request->input('fruits');
まとめ
HTTPリクエスト・レスポンス処理に利用できそうな機能を整理しました。やりたいことは大抵フレームワークで実現できますので、調査はとても大事。
利用頻度が高そうな機能を掲載していますが、他にも便利そうなものがあれば追記していきたいと思います。