Laravel - 17. アクション - レスポンスの処理

引き続きコントローラのアクションメソッドについて学習していきましょう。これまでに学習してきたようにアクションメソッドにおいては戻り値に文字列を指定したり、 view 関数の呼び出し結果を指定したりできます。これらの方法以外にも response 関数を使ってレスポンスをカスタマイズできます。ここではレスポンスのステータスコードやレスポンスヘッダを指定する方法を取り上げます。

それではテキストエディタで app/Http/Controllers/HelloController.php を開いて store アクションの戻り値を修正してみましょう。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Message;
use App\Http\Requests\MessageRequest;

class HelloController extends Controller
{
    public function index()
    {
        $title = "Hello Model!";
        $messages = Message::orderBy("id")->get();
        return view("hello/index", compact("title", "messages"));
    }

    public function create()
    {
        return view("hello/create");
    }

    public function store(MessageRequest $request)
    {
        $text = $request->input("text");
        $all = $request->all();
        $ua = $request->header("User-Agent");
        $path = $request->path();

        Log::debug("All:", $all);
        Log::debug("UA:" . $ua);
        Log::debug("Path:" . $path);

        return response("Request parameters: " . $text, 200)
                ->header("Content-Type", "text/plain");
    }
}

store アクションでは戻り値に response 関数の呼び出し結果を指定しています。 response 関数は第1引数に出力する文字列(レスポンスボディに格納する文字列)を指定し、第2引数にステータスコードを指定できます。また response 関数の戻り値に対して header メソッドを呼び出すことでレスポンスヘッダを指定できます。

動作確認

HelloControllerstore アクションを修正したので、PHPのビルトインWebサーバを使ってWebアプリケーションを起動してみましょう。次のようにコマンドを入力します。

$ php artisan serve --host 0.0.0.0
Laravel development server started: http://0.0.0.0:8000

続いてブラウザを起動してWebアプリケーションにアクセスしてみましょう。

http://localhost:8000/hello/create

入力フォームが表示されるので、メッセージを入力して送信ボタンをクリックします。

画面に入力したメッセージが表示されるでしょう。

同様の操作をもう一度繰り返して、Chromeのデベロッパーツールでネットワーク通信を確認してみましょう。

そうすると次のようなHTTPレスポンスを確認できるでしょう。

HTTP/1.1 200 OK
Host: localhost:8000
Date: Mon, 07 Sep 2020 05:54:30 GMT
Connection: close
X-Powered-By: PHP/7.3.21
Cache-Control: no-cache, private
Date: Mon, 07 Sep 2020 05:54:30 GMT
Content-Type: text/plain; charset=UTF-8
Set-Cookie: XSRF-TOKEN=eyJpdiI6InRMSFZ6T1dqdVkxS0o0SmNNbytaRGc9PSIsInZhbHVlIjoiOVRORTE4SzA4azI2MVYxeVllWUF5YldkVWhjYTB5ejFqQkI3cndtcVBvSWMwS2x0a3lTbkMrcW9hSHBxXC81Y2p6VGxKRDM1QlEyQWhpM3JlTHM5S1JIUXhrS0dzUDBXZXh2UFl6Y1JuXC95YXpqVUdYR1dmam1Kckk1Z0dwV1ZDZyIsIm1hYyI6IjI0MTNhYmU0NTQ3N2ZmMWVlYjg3ZWNhNDZlY2U5OGMyZDA2N2RhNGIwZGU0M2YyMWNmZTc2YWRjNzUzOWE1NDMifQ%3D%3D; expires=Mon, 07-Sep-2020 07:54:30 GMT; Max-Age=7200; path=/
Set-Cookie: laravel_session=eyJpdiI6ImE0K3U2ZmRiVndmeXcrR2N5c0wwNnc9PSIsInZhbHVlIjoiV3FoVUFRN3NPT1lwM244Y1hMcDh5SmJzMjZJcXk4WVRDZUxWbnpZSjdyZFZ4ZW5Sakk0eTgxZHlBMlh4aDF1SFRPSEZ1T3Y4WkJ2T1g2T1dVXC8zZ3NPOGFjUkdMYndEVVpEMlhWK0JjV3NNMlVoMWw1XC9HK0hjeEdNVmJIWkE4TCIsIm1hYyI6ImIwZDlkMzEwYzBlMjM2MDBiZDE0YjMwMmNmNzI5ZTRjOGUxN2FmZDA1ZTUyODkwYzM4MTgwODlkYmRlNzg4N2MifQ%3D%3D; expires=Mon, 07-Sep-2020 07:54:30 GMT; Max-Age=7200; path=/; httponly

HTTPのレスポンスからステータスコード 200Content-Type: text/plain; charset=UTF-8 が付与されているのがわかります。

まとめ

  • response 関数を使用することでレスポンスをカスタマイズできる
  • response 関数は第1引数にボディに出力するコンテンツ、第2引数にステータスコードを指定する
  • response 関数の呼び出し結果に header メソッドの呼び出しをチェーンすることでレスポンスヘッダを操作できる