LaravelでCRUDを作る

この記事は、「[【連載】初めてのWindows用Laravel 5.7開発環境構築入門](https://qiita.com/hitotch/items/a646972fe1992611e92b)」の孫記事です。環境などの条件は、親記事をご覧ください。
この記事は、「[XAMPPで動くLaravelのサンプルアプリを作成する 2018年12月版](https://qiita.com/hitotch/items/2633bad4a97925511d4e)」の子記事です。

---
　今回は、これまで作った環境上にCRUDアプリを作成します。

　データベースは前回の記事で作成しているので、そこにあるusersテーブルのレコード一覧と詳細閲覧画面を作ります。つまり、CRUDといってもR(=読み込み)だけ作ります。

作成するページは以下の２つです。

- http://example.com/users
- http://example.com/users/[id]

# コントローラを作る

まずコントローラを作ります。
※コントローラって何？という方は、とりあえず「そーなんだーふーん」で進んで、あとでMVCの勉強をされるとよいかと。

コントローラの雛形は、artisanで作れます。Visual Studio Codeでlaravelexampleプロジェクトを開いたら、```Ctrl + @```でターミナルを開き、次のコマンドを実行します。

```
php artisan make:controller UserController --resource
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/60ad943c-bbf1-0d02-ff80-98272ba14821.png)

作られたコントローラは、app\Http\Controllersに配置されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/0cb3bff6-8260-ba17-ee5d-4446be00109c.png)

中にあるindex()やcreate()が、アクションです。

取り急ぎ、http://example.com/usersに対応するべく、index()だけ作りましょう。

app\Http\Controllers\UserController.php の冒頭に、Userモデルを使うことを明示しておきます。

```php:UserController.php
use App\User;
```

index()には、ユーザーを一覧すべく、データベースから全ユーザーを読み込んでビューに渡すコードを書きます。

```php:UserController.php
    public function index()
    {
        //
        $users = User::all();
        return view('users.index', ['users' => $users]);
    }
```

ここで、ビューの名称は``users.index``としました。あとでこのBladeを作る必要があります。
こんな感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/66ea13e0-332a-9942-566f-ceb9b3d43c0b.png)

# ビュー(Blade)を作る

LaravelのビューはBladeで記述します。置き場所はresources\viewsです。

resources\viewsのフォルダを右クリックし、New Folderで``users``フォルダを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/a6710a47-c56b-97aa-01de-5ff04f6e3c0c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/4224428d-8456-c5f2-0cdc-6147704a2d7d.png)

続けて作ったusersフォルダを右クリック、New Fileで``index.blade.php``を作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/b25498dc-d381-0884-50fc-382fab1f6cba.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/93017444-e06b-c12d-3f31-023890e9999c.png)

``index.blade.php`` に以下を記述します。(手抜きコードなので本番では真似しないように。。。)

```php:index.blade.php
<ul>
    @foreach ($users as $user)
        <li><a href="{{ url('users/'.$user->id) }}">{{ $user->name }}</a></li>
    @endforeach
</ul>
```

ここで大事なのは、コントローラで記述した``['users' => $users]``によって、Blade側でforeachしながらユーザーオブジェクトを取り扱っていることです。

# ルートを作る

　LaravelがUserControllerのindexやcreateアクションにルーティングする（http://example.com/users を、UserControllerコントローラのindex関数につなぐ）ためには、ルートの設定が必要です。ルーティングは、routes\web.phpに設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/dd3fbcf7-d3b9-e749-1858-70c2d6046ef0.png)

この末尾に、以下を追加します。

```php:web.php
Route::resource('users', 'UserController');
```

以下のようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/4f74248e-ac5c-c03c-57d9-7bc018731c29.png)

保存を忘れないように。

# 動作テストする

XAMPPでApacheとMySQL(実はMariaDB)が起動していることを確認し、ブラウザを開けて http://example.com/users にアクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/1e2234cf-7414-6dad-8e4b-42d96dfacc19.png)

ちゃんと動作しました。

# 詳細表示画面を作る

次に、http://example.com/users/[id] の画面を作ります。[id]には、ユーザーIDが入ります。

まずusersコントローラのshow()に、以下のように記述します。

```php:UserController.php
    public function show(User $user)
    {
        //
        return view('users.show', ['user' => $user]);
    }
```

ここで大事なのは、引数にUserオブジェクトを指定している箇所です。本当ならIDがアクションパラメータとして入ってくるはずですが、「[モデル結合ルート](https://readouble.com/laravel/master/ja/routing.html#route-model-binding)」を利用することで、直接モデルをパラメータとして受け取っています。このため、コントローラではユーザーレコードをデータベースから読み込んでくる処理を書かなくてすみます。

``show.blade.php`` を作って、以下のコードを書き込みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/4df25e4c-9333-23c9-d862-7afad2449015.png)

```php:show.blade.php
<ul>
    <li>ID: {{ $user->id }}</li>
    <li>Name: {{ $user->name }}</li>
    <li>Email: {{ $user->email }}</li>
</ul>
```

保存を確認したら、先程のブラウザに戻って、adminをクリックしてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/93013f11-1b15-ab13-3d13-12bf121cb395.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/096b5f6b-bff7-13f4-4809-531a8d05e511.png)

うまく動作しましたね。

これで、とても簡単ですがLaravelのCRUDアプリが動作しました。