Laravel(ver.8)(ver.6)でひとこと掲示板作ってみた

# Laravel(ver.8)(ver.6)でひとこと掲示板作ってみた
# 前提条件
Larvelの環境構築は完了しているものとします。
今回はLaravel(ver.8)に合わせて書いています。
Laravel(ver.6)との違いも書いてあります。

目次
1.前準備
2.コントローラーとビューを作成する
3.ブラウザに掲示板を表示する
4.フォームデータを受け取る
5.モデルを作成する
6.モデルを使ってデータベースに投稿をインサートする
7.登録されたデータを表示する
8.フォームバリデーションを使ってエラーメッセージを表示させる
9.投稿削除機能を実装する
10.ページネーション機能を実装する

# 1.前準備
MAMPまたは、XAMPPを起動しておきましょう。
vscode上でターミナルを開きます。
【方法】
vscodeの上部メニューバーからターミナルを選択 → 新しいターミナルを押す。
![](https://i.imgur.com/cc38bGZ.png)
ターミナルを起動できましたら$の後ろに、php artisan serve
とコマンドを入力し、Enter。
※php artisan serve　はlaravel開始前に毎回起動させる。
![](https://i.imgur.com/SMw9iBm.png)
発行されたURL（ http://127.0.0.1:8000 ）をコピーして、ブラウザでアクセスしておきましょう。

※ブラウザでアクセスした際に「404 Not | Found」もしくは、前回作成した「Hello World」が表示されますが、現段階ではこのままで大丈夫です。

次に下記URLをクリックして、CSSのzipフォルダをインストールしましょう。
https://learning.techis.jp/laravel/css.zip

zipフォルダを解凍し、解凍されたCSSフォルダをlaravel_projectディレクトリの中のpublicフォルダの中に移動させておきましょう。
![](https://i.imgur.com/VQK2pPe.png)

config ディレクトリ内の app.php の70行目付近にある、時間設定のコードを下記のように変更してください。
‘timezone ’ => ‘ UTC ’ , → ’ timezone ’ => ‘ Asia/Tokyo ’ ,
※最後のカンマを忘れないようにしましょう。
![](https://i.imgur.com/08A1r0q.png)

データベース設計
以下のデータベース及び、テーブルを作成してください。
※テーブル名は、messagesのように複数形でなければなりません。

データベース名 : board テーブル名 : messages
(php Myadmin)
![](https://i.imgur.com/1LRd2mj.png)

Laravel側でDB接続の設定を行います。
laravel_projectディレクトリにある「.env」ファイルを開いてください。
9行目付近に下記のような記述があるので、下記と同様の内容に書き換えてください。
Macの方（MAMP）
4DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=board
DB_USERNAME=root
DB_PASSWORD=root

Windowsの方（xampp）
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=board
DB_USERNAME=root
DB_PASSWORD=

※.envを書き換えた時、ターミナルを一度抜けないと、キャッシュが残っている状態なので、ターミナルを開いて control + C で抜けましょう。

以上で前準備は完了です。
次ページからシステムを作っていきましょう！！

# 2.コントローラーとビューを作成する
vscode上のターミナルで、
$の後ろに、 php artisan make:controller BbsControllerと入力し、Enter。
成功メッセージが表示されると、
app / Http / Controllers / の中に BbsController.php が作成されています。

![](https://i.imgur.com/7Cj3TrA.png)

次にviewファイルを作成していきます。
laravel_project / resources / views ディレクトリ内に
いつもファイルを作成する時と同じように、bbs.blade.php
というファイルを作成しましょう。

![](https://i.imgur.com/WsrlLU6.png)

bbs.blade.php ファイル（viewの役割をするファイル）を作成できましたら、コードを書き込んでいきましょう。
先ほど作成した bbs.blade.php ファイルに下記画像のコードを書き込んでください。

![](https://i.imgur.com/N5wuTM8.png)

※6行目はbootstrap4のCDNを読み込んでいます。こちらは以下をコピペで大丈夫です！

"<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/  bootstrap.
min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9J
voRxT2MZw1T" crossorigin="anonymous">"

※ 8行目で前準備で用意したCSSファイルを読み込んでいます。
asset とは、publicディレクトリまでのパスを返してくれます。
（blade.php でのみ使える関数です。）

# 3.ブラウザに掲示板を表示する
BbsController に indexメソッド を作成し、bbs.blsde.php（viewファイル）を呼び出します。
![](https://i.imgur.com/yaOssMM.png)
次に、「indexメソッドで呼び出したbbs.blade.phpのページが表示されるように」設定しましょう。
laravel_project / routes / web.php を開いてみましょう。
![](https://i.imgur.com/0J0ZNuk.png)

web.phpを以下の様に編集します。

![](https://i.imgur.com/G3K5EEI.png)

http://127.0.0.1:8000 のURLでは BbsControllerのindexメソッドを実行するというコードになって
います。
それではブラウザでURLに再度アクセスし、以下の画面が出てきていたら成功です。

![](https://i.imgur.com/nmnN7cU.png)


# 4.フォームデータを受け取る
下記画像のように bbs.blade.php のformタグのaction属性を /bbs_add にしましょう。
更に14行目に 「@csrf」というコードを書き加えてください。
※LaravelではPOST送信を行う際、csrfトークンを必ず送信しないとエラーが出てしまいます。
フォームでデータを送信する際は、フォームタグの中のどこかに「@csrf」を追加することを覚えておきましょう。
<input type=”hidden” name=”_token” value=”csrf対策トークン”>が自動生成されます。
![](https://i.imgur.com/9wZ0OJa.png)

formタグのaction属性を指定できたので、アクセスする為のルートを設定していきます。
Web.phpに以下のコードを追記してください。
formタグのmethod属性が post になっているので、Route :: post ( ~~[~]) に指定します。

![](https://i.imgur.com/kVHsdtL.png)

次に BbsControllerのコードを追加していきましょう。

![](https://i.imgur.com/oveZFcW.png)

前回作成した indexメソッドの下に addメソッドを作成していきます。
【解説】
indexメソッドとの大きな違いは、メソッド名の後に Request ＄request の引数が入っていることで
す。
RequestとはLaravelで、リクエスト(Request)というのは、
ブラウザを通してユーザーから送られる情報をすべて含んでいるオブジェクトのことです。
ユーザーからの全てのリクエスト(掲示板の投稿データ)を受け取り、＄requestに渡されてます。
$request -> ( フォームのname 属性 ) で値を取り出せます。


# 5.モデルを作成する
データベース関連の操作を行うために、「モデル」の作成を行います。
vscode上でターミナルを開き$の後ろに、 php artisan make:model Message
を入力してください。
成功メッセージが確認できたら、
app\Modelsのディレクトリ内に Message.php が作成されています。
もし、appディレクトリ内に Message.php が作成されている場合はModelsフォルダ内に移動しましょう。

![](https://i.imgur.com/vOE6FgA.png)

※モデル名の命名について
Laravelのクエリ(SQL)ではテーブル名の指定を行いません。
但し、基本的にデータベースのテーブル名を複数形 ( messages ) 、モデルのファイル名や、中で使うのを単数形 ( Message )にしなければなりません。


# 6.モデルを使ってデータベースに投稿をインサートする
BbsControllerに前回作成したモデルを使う為のコードを書いていきます。
以下の画像の6行目のコードを追加してください。
![](https://i.imgur.com/glxnYue.png)

【解説】
「App\Models\Message を使うよ！」って宣言しています！
同じくBbsControllerのaddメソッドに20~26行目のコードを追記してください。

![](https://i.imgur.com/GfMvZY6.png)

【解説】
画像の20〜23行目は、データをテーブルにインサートする為の準備をしています。
＄dataという連想配列を作成していますが、key(今回は view_name と message)にテーブルのカ
ラム名を指定し、カラムに入れたいデータをvalue ( 今回は ＄name と ＄message ) に入れています。
24行目に Message.php(モデル) を使って messagesテーブル にデータをインサートし、処理が完了したら、再び掲示板のメイン画面にリダイレクトするプログラムになっています。
「モデルのファイル名の.phpより前の部分 :: insert(格納したいもの);
と書く事で、インサートすることができるんだ！」という認識で大丈夫です！
ここまでできましたら実際にフォームを送信してみましょう。
![](https://i.imgur.com/PK0HSop.png)
レコードが登録されていたら成功です！

![](https://i.imgur.com/kM0bDPi.png)

※下記のようなエラーがあった場合は
![](https://i.imgur.com/I5PT986.png)
congig > database.phpを開き
![](https://i.imgur.com/1QvLHDI.png)
59行目の'strict' => true を false に変更する。


# 7.登録されたデータを表示する
まず、データベースに登録した内容を取得していきます。
BbsControllerのindexメソッドを書き換えていきましょう。
![](https://i.imgur.com/HfweLi2.png)
【解説】
12行目から14行目は、Messageモデルを使用して、where文で １ と言う内容を ＄bbs_data 変数に代入しています。
15行目には viewファイルを呼び出しと一緒に compact 関数を使って $bbs_data の内容をview側に送っています。
bbs.blade.phpのformタグの下に以下のコードを追加してください。

![](https://i.imgur.com/8zipS5A.png)

【注意】
Laravelでデータベースから取得してきたデータはオブジェクト型になります。
なので、オブジェクト {{ ＄data -> name }}という書き方をしなくてはなりません。
※配列での値の取り出し方と異なってくるので注意しましょう。
配列の場合 {{ ＄data[ ‘ name ’ ] }} オブジェクトの場合 {{ $data -> name }}
投稿データを表示できたら成功です！

![](https://i.imgur.com/oz0wY3F.png)

# 8.フォームバリデーションを使ってエラーメッセージを表示させる
BbsControllerのaddメソッドに以下の画面の様にコードを追加してください。
![](https://i.imgur.com/08sUyuh.png)
【解説】
フォームから送信されてきたデータに対してバリデーションルール（入力フォームに対して、入力制限や入力チェックを行うことです。）を設定しています。
【ルール詳細】
required ・・・ 空白NG max : 10 ・・・ 10文字以内
先ほどのフォームを空白のまま送信してしまったり、文字数をオーバーしている状態で送信する
と、何も実行されずエラーメッセージを所持して、元の画面に強制リダイレクトされます。

次に、エラーメッセージは $errors -> first( name属性 ) で取得できるので、bbs.blade.phpで表示させてみましょう。
bbs.blade.phpにエラーメッセージを表示させるコードを追加していきます。
下記のコードの20行目から22行目と29行目から31行目を追加してください。

![](https://i.imgur.com/n2bBtdu.png)

空白のまま送信すると以下の様なエラーメッセージが表示されればバリデーション完了です！

![](https://i.imgur.com/3GXSTP5.png)

しかし、バリデーションが英語表記になっているので、日本語に対応させていきます。
resources / langディレクトリ内に新しく ja ディレクトリを作成します。
同じlangディレクトリ内にデフォルトである en ディレクトリ内のファイルを、全て ja ディレクトリにコピーしてください。

![](https://i.imgur.com/JBhrEGS.png)

次に、下記のリンク内のコードを全てコピーしてください。

日本語バリデーションデータ
https://gist.github.com/syokunin/b37725686b5baf09255b

resources / lang / ja / varidation.phpファイルの中身を、全て日本語版バリデーションデータのコードに書き換え、一番下の attributes の所を以下のように追記してください。

![](https://i.imgur.com/NCmKd4u.png)

最後に config / app.php ファイルの83行目にある locale => ‘ en ’ を locale => ‘ ja ’ に変更してください。

![](https://i.imgur.com/1UMtQWa.png)

日本語バリデーションの設定は以上になります。
もう一度、空白等でメッセージの投稿を行った際に、日本語でエラーメッセージが表示されていたら成功です！

![](https://i.imgur.com/3nNudY2.png)

# 9.投稿削除機能を実装する
全ての投稿に対して削除機能を実装していきます。
まずは削除ボタンを作ってみましょう。
bbs.blade.phpに以下のコードを追加し、削除ボタンを実装しましょう。

![](https://i.imgur.com/xtKEcN4.png)

55行目から57行目のコードを追加しましょう。

更に、bbs.blade.phpに javascript のコードを追記してください。

![](https://i.imgur.com/GwkEcP5.png)

【解説】
javascript にて bbs_delete関数を作成します。
削除ボタンがクリックされた際に、投稿 id を取得し、投稿削除メソッドへ送ります。
view側の準備ができましたので、次に Web.php の追記をしていきます。

![](https://i.imgur.com/UxQDy74.png)

【解説】
URLの指定が / delete / { id } と見慣れない形式になっています。
{ id } とすることでそこに入れた値をController側で $id で受け取ることができます。

次に、コントローラーの設定をしていきます。
BbsControllerにdeleteメソッドを追加していきましょう。

![](https://i.imgur.com/nSAZim7.png)

37行目の delete ( $id ) で Web.php で指定した { id } の値を受け取っています。
39行目から43行目にて、Messageモデルを使用し、取得した投稿 id を参照に is_deleteカラムを1 に、updated_at カラムに現在のタイムスタンプを挿入して、対象レコードを更新します。（データベースの変更したい内容を更新します。）
レコードの更新が完了した後、45行目で「メイン画面にリダイレクトする」というプログラムになっています。
削除機能の実装は以上になります。削除ボタンを押した投稿が削除されていたら成功です！

# 10.ページネーション機能を実装する
最後に、投稿一覧にページネーション機能を実装していきます。
BbsControllerのindexメソッドを編集していきます。

![](https://i.imgur.com/LyCKWFG.png)

15行目のクエリの文末を get() から paginate ( 区切り数 ) に変更するのみです。
次に bbs.blade.php にページネーション用のリンクを設置します。

![](https://i.imgur.com/yn2gLDu.png)

投稿一覧の下に {{ $bbs_data->links() }} と追記するだけです。
これでページネーション機能の実装は完了です。

５投稿目以降に以下のようなページネーションリンクが作成されていたら成功です！

![](https://i.imgur.com/MzPnK7c.png)

以上でひとこと掲示板の製作は終了です。

# laravel(ver.8)の重要ポイント
- ルートの指定方法の変更
laravel 7 までは　Route::get('/', 'BbsController@index');のようにコントローラー名とメソッド名で指定できていました。
laravel 8 では、以下のようにネームスペース + 配列を使うようになりました。
![](https://i.imgur.com/APyp2bG.png)

- appの配下に新規でModelsのフォルダができたことです。
laravel 7　までは、appの配下にModelのファイルができていましたが
laravel 8 では、app\Modelsの配下に置くことになりますので、呼び出す際の指定を間違えないように、注意してください。