【備忘録】【Laravel8】フォームに入力 〜 Requestで受け取って表示させるまで

Laravelを１から学習しており、自分のための備忘録です。
間違っている点がありましたらご指摘いただけますと幸いです。
※掲示板を作っていると仮定して記事を投稿しています。

# 入力フォームを作る

まず、入力フォームを作ってみます。
/bbs でアクセスできるように、routes/web.phpの一番下に下記を追記します。

```php:routes/web.php
Route::get('/bbs', 'BbsController@index');
```

/bbs にアクセスが来た場合にBbsControllerのindex関数を参照します。

次に、その参照先である、BbsControllerを作っていきます。
app/Http/Controllers/BbsController.phpというファイルを作成してください。

中身は以下のようにします。

```BbsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BbsController extends Controller
{
    // Indexページの表示
    public function index() {
        return view('bbs.index');
    }

}
```

参照先であるindex関数は、bbs.indexのビューを返すだけの単純な関数ですね。

最後にビューを作ります。
resources/views/bbsというディレクトリを作ってください。
そしてその中にindex.blade.phpというファイルを作ります。 
そのファイルの中身は以下です。

```php:index.blade.php
<!DOCTYPE HTML>
<html>
<head>
    <title>掲示板</title>
</head>
<body>

<h1>掲示板</h1>

<!-- フォームエリア -->
<h2>フォーム</h2>
<form action="/bbs" method="POST">
    名前:<br>
    <input name="name">
    <br>
    コメント:<br>
    <textarea name="comment" rows="4" cols="40"></textarea>
    <br>
    {{ csrf_field() }}
    <button class="btn btn-success"> 送信 </button>
</form>

</body>
</html>
```

フォームの送り先は、POSTメソッドで/bbs（つまり自分自身）です。要素は下記の3つです。

```
name
comment
_token
```

nameとcommentは何を意味しているのでしょうか。このあと解説していきたいと思います。
_tokenは{{ csrf_field() }}の部分の実装となります。 フォームのセキュリティを高めるためのLaravelの機能ですが、ここでは詳しい説明は割愛します。

これで、http://localhost/bbs にアクセスするとフォームが表示されているはずです。ですが・・・
実際にコメントを投稿をしてみるとエラーになります（当然ですが）。
理由はPOSTメソッドの受け口を作っていないからです。実装していきます。

### POSTを受け取る

投稿された内容を受け取って、さらに表示までできるようにするためには、
Controllerへの記述が必要になります。

```php:BbsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BbsController extends Controller
{
    // Indexページを表示させるための記述
    public function index() {
        return view('bbs.index');
    }

    // 投稿フォームに入力した内容を$requestという名前で利用する（受け取る）宣言
    public function create(Request $request) {

        // 投稿内容をビューの各要素から受け取って変数に入れる
        $name = $request->input('name');
        $comment = $request->input('comment');

        // 入れた変数をまたビューに渡すことで投稿内容を表示させる
        return view('bbs.index')->with([
            "name" => $name,
            "comment"  => $comment,
        ]);
    }

}
```

create関数の中を見てみます。
やっていることは単純で、まずは受け取った$requestから要素nameと要素commentを取り出し、 それぞれ＄nameと＄commentという変数に代入しています。 その後、view_withの関数を使って、＄nameをnameという名前、＄commentをcommentという名前でビュー（bbs.index）に渡しています。この処理によって、受け取った投稿内容を表示させることができます。

では、最後にビューに修正を加えます。
resources/views/bbs/index.blade.phpのフォーム上部に受け取った内容を表示させるために、
下記のように書き換えます。

```php:index.blade.php
<!DOCTYPE HTML>
<html>
<head>
    <title>掲示板</title>
</head>
<body>

<h1>掲示板</h1>

<!-- 直前投稿エリア -->
@isset($name, $comment)
<h2>{{ $name }}さんの直前の投稿</h2>
{{ $comment }}
<br><hr>
@endisset

<!-- フォームエリア -->
<h2>フォーム</h2>
<form action="/bbs" method="POST">
    名前:<br>
    <input name="name">
    <br>
    コメント:<br>
    <textarea name="comment" rows="4" cols="40"></textarea>
    <br>
    {{ csrf_field() }}
    <button class="btn btn-success"> 送信 </button>
</form>

</body>
</html>
```

※追加した箇所はこちらです。

```php:BbsController.php
<!-- 直前投稿エリア -->
@isset($name, $comment)
<h2>{{ $name }}さんの直前の投稿</h2>
{{ $comment }}
<br><hr>
@endisset
```

@isset〜@endissetを使っていますが、これは、この２つの変数が存在する場合のみ内容を表示させるためのものです。


▼参考にさせていただいた記事

https://team-lab.github.io/skillup/step2/04-laravel-form.html

https://zenn.dev/naoki_oshiumi/articles/b542f7daca7a95

https://qiita.com/gununu1028/items/a676054ae8597e1d2983