Laravel で掲示板作りたくなった(3)

前回。[Laravel で掲示板作りたくなった(2)](http://qiita.com/localdisk/items/10f209252114b1a8b86d)

インスパイヤ元: [インスパイヤされて掲示板を作りたくなった(3)](http://qiita.com/tadsan/items/498710c5199349e6d7a8#_reference-8c80ba331258bd3a6cd5)

今回は、掲示板の一覧を出してみるよ。

# ルーティング

`GET /lists` で掲示板の一覧を出力します。まずはルート定義。

```php:app/Http/routes.php
<?php
Route::get('lists', function() {
    return '掲示板の一覧';
});
```

ではブラウザで確認してみましょう。

```shell-session
$ php artisan serve
Laravel development server started on http://localhost:8000/
```

して、`http://localhost:8000/lists` にアクセスすると `掲示板の一覧` と表示されていれば OK.
コマンドでルートの確認もできます。`php artisan route:list` とコマンドをたたくと…

```shell-session
$ php artisan route:list
+--------+----------+-------+------+---------+------------+
| Domain | Method   | URI   | Name | Action  | Middleware |
+--------+----------+-------+------+---------+------------+
|        | GET|HEAD | /     |      | Closure |            |
|        | GET|HEAD | lists |      | Closure |            |
+--------+----------+-------+------+---------+------------+
```

## 番外: Laravel で作るエラーページ

Laravel でエラーページ(404とか)を作るのは簡単で `resources/views/errors/{statuscode}.blade.php をおけばよいだけです。404　の場合は `resouces/views/errors/404.blade.php` を作ります。

```php:resources/views/errors/404.blade.php
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>404 Not Found</title>
</head>
<body>
    <h1>404</h1>
</body>
</html>
```

こんな感じで作って、ルート定義されていない URL を叩くとこのページが表示されます。簡単。ついでにちょっとしたテストを書いてみましょう。

```shell-session
$ php artisan make:test NotfoundTest
```

とすると `test/NotfoundTest.php` というファイルが作られます。このファイルを下記のように修正…

```php:tests/NotfoundTest.php
<?php

class NotfoundTest extends TestCase
{
    /**
     * 404 NotFound テスト
     *
     * @return void
     */
    public function testNotFound()
    {
        // notfound というルートにアクセス
        $result = $this->get('notfound');
        // 404 という文字列があるか
        $result->see(404);
        // ステータスコードは 404 か
        $this->assertEquals(404, $result->response->getStatusCode());
    }
}
```

で PHPUnit を実行すればよいです。

# モデルを定義する

`boards` テーブルに対応するモデルを作成しましょう。`php artisan make:model` コマンドを使いましょう。

```shell-session
$ php artisan make:model Models/Board
```

とすると `app/Models/Board.php` が生成されます。

```php:app/Models/Board.php
<?php

namespace InspireBBS\Models;

use Illuminate\Database\Eloquent\Model;

class Board extends Model
{
    //
}
```

# 掲示板の一覧を出力する

では、掲示板の一覧を出力する処理を書いていきましょう。

```php:app/Http/routes.php
Route::get('lists', function(\InspireBBS\Models\Board $board) {
    return view('list', ['boards' => $board->all()]);
});
```

クロージャの引数に先ほど作成した `Board` クラスを設定してます。こうしておくと自動でインスタンスが生成されてインジェクションされるので楽ちん。で、`view` 関数の第2引数に `boards` というキーで `boards` テーブルの内容をすべて取得する `all` メソッドを呼んでます。これは View にデータを渡すためのものです。

あとは View を作れば完成。

```php:resources/views/list.blade.php
@extends('layouts.default')

@section('content')
    <ul>
        @foreach($boards as $board)
            <li>{{ $board->name }}</li>
        @endforeach
    </ul>
@stop
```

レイアウトを継承して `content` セクションに掲示板の名前を出力しています。`foreach` ディレクティブ便利。

これで完成。 `http://localhost:8000/lists` にアクセスしてみましょう

![inspire.png](https://qiita-image-store.s3.amazonaws.com/0/25478/3ca26aea-c6e8-e694-33be-cb8c202ee5ca.png)

できました！ 続く！