Laravel 演習入門

いろいろな Hello World!

Response の基礎

問題

以下のようなページを作成してください。

  1. GET /text にアクセスすると、 Content-Type が text/plain 形式で Hello World! が表示される
  2. GET /json にアクセスすると、 Content-Type が application/json 形式で {"greet":"Hello World!"} が表示される
  3. GET /html にアクセスすると、 Content-Type が text/html 形式で赤い文字の Hello World! が表示される

問題は、以下の手順で解いてください。

  1. Red:小さいテストを作成し、失敗を確認してください
  2. Green:テストを成功させてください
  3. Refactor:整理・整頓してください
  4. 必要に応じて、1から3を繰り返してください

ヒント

背景知識
便利なアサーションの例

アサーションの調べ方 も合わせてご覧ください。
今回は、以下を使うのではないかと思います。

解答例

続きを読む

実行環境:

Red1: /text

テストを作成します。
bash:

php artisan make:test ResponseTest

tests/Feature/ResponseTest.php:

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ResponseTest extends TestCase
{
    public function test_plain_textを表示(): void
    {
        $response = $this->get('/text');
        $response->assertStatus(200)
            ->assertHeaderContains('Content-Type', 'text/plain')
            ->assertSeeText('Hello World!');
    }
}

テストの失敗を確認します。

Green1

ルーティングファイルを編集します。
routes/web.php:

use Illuminate\Support\Facades\Route;

Route::get('/text', function () {
    return response('Hello World!')
        ->header('Content-type', 'text/plain');
});

テストの成功を確認します。

Refactor1

リファクタリングは特に有りません。

Red2: /json

テストを追加します。
tests/Feature/ResponseTest.php:

    public function test_jsonを表示(): void
    {
        $response = $this->get('/json');
        $response->assertStatus(200)
            ->assertHeaderContains('Content-Type', 'application/json')
            ->assertJsonPath('greet', 'Hello World!');
    }

テストの失敗を確認します。

Green2

ルーティングを追加します。
routes/web.php:

Route::get('/json', function () {
    return ['greet' => 'Hello World!'];
});

テストの成功を確認します。

Refactor2

リファクタリングは特に有りません。

Red3: /html

テストを追加します。
tests/Feature/ResponseTest.php:

    public function test_htmlを表示(): void
    {
        $response = $this->get('/html');
        $response->assertStatus(200)
            ->assertHeaderContains('Content-Type', 'text/html')
            ->assertSee('color:red', false)
            ->assertSeeText('Hello World!');
    }

テストの失敗を確認します。

Green3

ルーティングを追加します。
routes/web.php:

Route::get('/html', function () {
    return '<div style="color:re">Hello World!</div>';
});

テストの成功を確認します。

Refactor3

リファクタリングは特に有りません。

解説

続きを読む

Response メソッドについて

リクエストのライフサイクルを知っておくことは重要です。
詳細は: 或るリクエストの一生 にあります。

今回は、その中の Response オブジェクトについての問題でした。

ルーティングで渡されるコントローラーのメソッドで、戻り値として文字列を返すと、自動的に Response オブジェクトにかえて、 text/html の Response を作成してくれます。
配列を返せば、 json にしてくれます。

text/plain にしたい場合など、直接 Response オブジェクトを操作するメソッドもあります。

また、将来的には、Blade や Inertia などの view を使うことで、表示をファイルに分けて作成できるようにもなります。


<= 問題を読んだ・解いた・理解したなどのチェックにご利用ください。クリックすると、チェックが変化します。
問題一覧に戻る