豆腐とコンソメ

豆腐とコンソメ

もろもろのプログラム勉強記録

Laravelで始めるTDD開発 (4):個別ページを作成する

前回の続き

ちょっとだけ慣れてきた感じがする。今日このごろ。

www.tohuandkonsome.site

やること

/thread/1にアクセスすると、対応するthreadのページが見えるようにしてみる。

個別ページのテストコードを書く

まずは、個別ページが見えることのテストコードはこんな感じに。

ThreadTest.php

<?php
    /**
     * すべてのユーザーは、/thread/{id}にアクセスすると、idに対応するthreadが参照できること
     *
     * @return void
     */
    public function test_all_user_can_view_thread()
    {
        //Threadがあって
        $thread = factory('App\Thread')->create();

        //Threadを表示するURLにアクセスすると
        $response = $this->get('/thread/'.$thread->id);
        
        //Threadの内容が見えるんだよ
        $response->assertSee($thread->body)
                 ->assertSee($thread->title);
    }

実装を書く

ルーティングはこんな感じで、 web.php(抜粋)

<?php
//Threadを表示する
Route::get('/thread/{thread}', 'ThreadController@show');

コントローラーはこんな感じになる。

ThreadController.php(抜粋)

<?php
    public function show(Thread $thread)
    {
        return view('thread.show', compact('thread'));
    }

冷静に考えると、こんな感じにするんだけれども (といっても、この例自体もLaravelならではの機能があって、なんか説明しにくいね。)

普通はこうなんじゃ

<?php

//web.phpがこんな感じだったとして
//  Route::get('/thread/{id}', 'ThreadController@show');

//コントローラーのstoreはこんな感じ
    public function show($id)
    {
      //URIのidを条件にひとつのthreadをとってくる 
      $thread = Thread::find($id) 
       return view('thread.show', compact('thread'));
    }

Laravelでは、URIとコントローラーにモデルが定義されていると、勝手にURIの数字に紐づくidをもとに対象のインスタンスをコントローラーに渡してくれるみたい。 恐ろしい子。

ルーティング 5.5 Laravel

Laravelはタイプヒントされた変数名とルートセグメント名が一致する場合、Laravelはルートかコントローラアクション中にEloquentモデルが定義されていると、自動的に依存解決します。

個別画面

個別画面は新たにshow.blade.phpを用意して、ほぼコピペで終えます。

show.blade.php

@extends('layouts.app')
@section('content')
<div class="container">
    <h1>This is Thread's Detail!</h1>
        <div class="thread">
            <h1> {{ $thread->title }} </h1>
            <p> {{ $thread->body }} </p>
        </div>
    </div>
</div>
@endsection

テストを実行する

問題なく通りました。
ちなみにphpunitで --filterオプションでメソッドを指定してあげると、対象のメソッドだけテストしてくれるみたいです。

テストコードを実行

$ phpunit --filter test_all_user_can_view_thread
PHPUnit 6.4.4 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 1.66 seconds, Memory: 14.00MB

ためしにブラウザで見てみると、こんな感じになりました。

f:id:konoemario:20171202004932p:plain
/thread/1にアクセスした場合

次回は登録ページを作成します。