前回の続き
ちょっとだけ慣れてきた感じがする。今日このごろ。
www.tohuandkonsome.site
やること
/thread/1
にアクセスすると、対応するthreadのページが見えるようにしてみる。
個別ページのテストコードを書く
まずは、個別ページが見えることのテストコードはこんな感じに。
ThreadTest.php
<?php
@return
public function test_all_user_can_view_thread()
{
$thread = factory('App\Thread')->create();
$response = $this->get('/thread/'.$thread->id);
$response->assertSee($thread->body)
->assertSee($thread->title);
}
実装を書く
ルーティングはこんな感じで、
web.php(抜粋)
<?php
Route::get('/thread/{thread}', 'ThreadController@show');
コントローラーはこんな感じになる。
ThreadController.php(抜粋)
<?php
public function show(Thread $thread)
{
return view('thread.show', compact('thread'));
}
冷静に考えると、こんな感じにするんだけれども
(といっても、この例自体もLaravelならではの機能があって、なんか説明しにくいね。)
普通はこうなんじゃ
<?php
public function show($id)
{
$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
ためしにブラウザで見てみると、こんな感じになりました。
次回は登録ページを作成します。