Laravelを一年間くらいやったので、個人的ハマりポイントと掲示板作成！

こんにちは。Advent Calendar初参加です！😃
Advent Calendar 2019の7日目の記事になります。
去年の6月からお仕事でLaravelを使えることになって、Webシステムの開発をやってました。自宅でも復習がてらに掲示板を作ってみました。
お仕事や自分で一年間くらい使って、個人的に感じたLaravelのハマりポイント的なことのまとめと、簡単な実装だけですが、作った掲示板の紹介をしたいと思います。

## ハマりポイントと解決方法
思い出せたものだけ。ホントはもっと色々あったはずだけど。。
何かにメモっておけばよかったです😓

### 暗号化キーの未設定エラー
起動して画面を確認すると「No application encryption key has been specified.」というエラーメッセージが...
下記コマンドで実装すると.envのAPP_KEYに値が設定されて、正常に動くようになる。

```
php artisan key:generate
```

### .envが読み込めてない。
なぜか分からないけど、.envが読み込めてなくて、渡しているパラメータが空になっておりエラーが出ていました。

```
htmlspecialchars() expects parameter 1 to be string, object given
```
bootstrap/cache/config.php にあるキャッシュファイルを削除します。

### postするときにエラーが出るんだけど。
@csrfをformに入れ忘れている可能性があるので、formタグの中に入れておきましょう。

```
    <form action="{{ route('board.save') }}" method="POST" id="make_board" class="mt-3">
        @csrf
        <div class="form-group">
```

### helperが読み込まれない。
helperを作っているプロジェクトでgitでソースを取ってきた後に、起動するとhelperが無いエラーが出ることがあります。

```
composer dump-autoload
```

## 作ってみた掲示板の紹介
復習として作ってみました。ログインなしのすごく簡単なものになってます。

ソースはこちら！🥳
https://github.com/YasuakiHirano/codelike_bbs

### 動作確認
こちらに動作環境、置いてみました！
=> http://codelikebbs.codelike.info/

![codelikebbs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43599/c528822e-ec16-865e-b800-1445072a9213.gif)

## 技術的ポイント
### FormRequestを使ってみた
掲示板保存のバリデーションするときに、ちょっと工夫してFormRequestを別ファイルで作成して使っています。

・バリデーション用のフォームリクエストです。
<details>
<summary>BoardCreateRequest.php（クリックで開きます）</summary>
<div>

```php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class BoardCreateRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    /**
     * バリデーションルール
     * @return array
     */
    public function rules()
    {
        return [
            'board_title' => 'required|max:30',
            'user_name' => 'required|max:30',
            'about_text' => 'required|max:5000',
            'password' => 'required|max:30'
        ];
    }

    /**
     *  バリデーション項目名定義
     * @return array
     */
    public function attributes()
    {
        return [
            'board_title' => 'タイトル',
            'user_name' => '名前',
            'about_text' => '説明文',
            'password' => 'パスワード'
        ];
    }

    /**
     * バリデーションメッセージ
     * @return array
     */
    public function messages()
    {
        return [
            'board_title.required' => ':attributeを入力してください。',
            'board_title.max' => ':attributeは30文字以下で入力してください。',
            'user_name.required' => ':attributeを入力してください。',
            'user_name.max' => ':attributeは30文字以下で入力してください。',
            'about_text.required' => ':attributeを入力してください。',
            'about_text.max' => ':attributeは5000文字以下で入力してください。',
            'password.required' => ':attributeを入力してください。',
            'password.max' => ':attributeは30文字以下で入力してください。'
        ];
    }
}
```

</div>
</details>

上記のリクエストを保存メソッドで下記のように使っています。
メソッドにリクエストが来るタイミングでバリデーションして、ダメだったら返してくれます。
Controllerに書かなくていいのでスッキリしますね😄

```php
    /**
     * 新規掲示板保存
     * @param BoardCreateRequest $request
     * @return RedirectResponse
     */
    public function save(BoardCreateRequest $request)
    {
        /** @var Board $board */
        $board = new Board();
        $board->fill([
            'title' => $request->board_title,
            'user_name' => $request->user_name,
            'about_text' => $request->about_text,
            'password' => $request->password
        ])->save();

        return redirect()->route("top.index");
    }
```

### ルーティングを書くときには名前を
書くときにnameを付けておくと、formのactionの指定や画面遷移が楽です。
下記のようにそれぞれ、nameを付けておくと...

```php:web.php
// 掲示板一覧[トップ]
Route::get('/', 'TopPage@index')->name("top.index");

// 掲示板作成
Route::get('/post', 'MakeBoard@index')->name("board.index");
Route::post('/post/save', 'MakeBoard@save')->name("board.save");

// 掲示板詳細
Route::get('/detail', 'DetailPage@index')->name("detail.index");
Route::post('/detail/response', 'DetailPage@makeResponse')->name("detail.response");
Route::post('/detail/delete', 'DetailPage@deleteBoard')->name("detail.delete");
```

formとかlinkとかredirectとかを書くときに、routeヘルパで下記のように楽に呼び出せるのでいい感じです。

```php:formタグの箇所
<form action="{{ route('board.save') }}" method="POST" id="make_board" class="mt-3">
```

```php:linkタグの箇所
    <div class="mt-3 mb-3 row justify-content-end">
        <a href="{{ route('board.index') }}" class="btn btn-primary mr-3">新規登録</a>
    </div>
```

```php:redirectの箇所
 return redirect()->route("top.index");
```

### formの入力箇所にはoldを入れよう
oldヘルパを使っておけば、バリデーションエラーになった場合にも値がフォームに保持されたままになるので、使いやすい投稿フォームになります。
oldの引数にはテキストボックスやエリアのnameを設定しておけばOKです！

```php:投稿フォームの一部
        <div class="form-group">
            <label for="board_title">タイトル</label>
            <input type="text" class="form-control" name="board_title" id="board_title" value="{{ old('board_title') }}" maxlength="140">
        </div>
        <div class="form-group">
            <label for="user_name" class="col-form-label">名前</label>
            <input type="text" class="form-control" name="user_name" id="user_name" value="{{ old('user_name') }}" maxlength="140">
        </div>
```

### 関連リンク
作っていく過程を自分のブログに書いていきました。
[Laravel5.8で掲示板を作ってみる(５）](https://blog.codelike.info/laravel_make_bbs5/)
[Laravel5.8で掲示板を作ってみる(４）](https://blog.codelike.info/laravel_make_bbs4/)
[Laravel5.8で掲示板を作ってみる(３）](https://blog.codelike.info/laravel_make_bbs3/)
[Laravel5.8で掲示板を作ってみる(２）](https://blog.codelike.info/laravel_make_bbs2/)
[Laravel5.8で掲示板を作ってみる(１）](https://blog.codelike.info/laravel_make_bbs/)

### 他にやりたかったこと
今回できませんでしたが、構想として下記を考えていました。
今後実装してみようと思います。
・UseCaseを業務で使ったけど、今回サンプルには組み込めなかった。
・Laravelのログイン機能の組み込み
・Api化して、Nuxt.jsと連携した掲示板作成。

## 終わりに
多分ほとんど既出内容で拙い記事でしたが、最後まで見ていただきありがとうございました。😆
少しでも刺激になったり、お役に立てれればと思います。今後もPHP開発ではLaravelを積極的に使って行きたいと思います！