Laravel5.8で掲示板を作ってみる(4)

LaravelLaravel

概要

前回はDBの用意まで完了したので、今回は掲示板を作る(新規投稿)のところまでやってみます。

Controllerを作る

下記コマンドで新しくコントローラーを作成できます。
基本的には画面毎に作っておく位が適切かなーと思います。

php artisan make:controller [コントローラー名]

トップページと投稿ページ用にコントローラーを二つ作りました。

$codelike_bbs>php artisan make:controller MakeBoard
Controller created successfully.
codelike_bbs>php artisan make:controller TopPage
Controller created successfully.

新しく作られたコントローラーを開くと
何も書いてなくて、こんな感じになってます。

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

class TopPage extends Controller
{
    //
}

トップページを編集する

TopPageコントローラーを編集する

下記のように修正しました。
このコントローラーのindexにアクセスされたときに、前回作ったBoardモデルをnewして、allメソッドでリストを取ってきて
トップページのビューに渡すようにしました。(viewメソッドの第二引数で渡しています)

HttpControllersTopPage.php

 ・・・省略・・・
class TopPage extends Controller
{
    public function index()
    {
        /** @var Board $board */
        $board = new Board();
        $board_list = $board::all();

        return view('top_list', ['board_list' => $board_list]);
    }
}

トップページのビューを編集する

下記のように修正しました。
貰ったデータリスト分回して、foreach でリストを作成しています。

resourcesviewstop_list.blade.php

@extends('layouts.app')

@section('content')
    <div class="mt-3 mb-3 row justify-content-end">
        <a href="{{ route('board.index') }}" class="btn btn-primary mr-3">新規登録</a>
    </div>
    <ul class="list-group">
        @if(isset($board_list))
            @foreach ($board_list as $board)
                <li class="list-group-item">
                    <div class=" d-flex justify-content-between">
                        {{ $board->title }}
                        <small>{{ date_format($board->created_at, 'Y/m/d') }}</small>
                    </div>
                </li>
            @endforeach
        @else
            <li class="list-group-item">
                投稿がありません。
            </li>
        @endif
    </ul>
@endsection

投稿ページを編集する

MakeBoardコントローラーを編集する

こっちはコントローラーのindexにアクセスされたときに単純にview(投稿ページ)を表示しています。
saveメソッドのほうでは引数で受けたformのリクエスト値を保存するようにしました。
保存後にredirect()->route(‘top.index’)でトップページにリダイレクトしています。

appHttpControllersMakeBoard.php

 ・・・省略・・・
class MakeBoard extends Controller
{
    public function index()
    {
        return view("post_bbs");
    }

    public function save(Request $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");
    }
}

投稿ページのビューを編集する

単純に親のビューと継承してフォームを作っているだけです。
laravelのフォームでは@csrf(旧バージョンcsrf_field()ヘルパ使用)を入れておかないと、フォームのサブミット時にエラーになるため、注意が必要です。
トップのページも使っていますが、 web.phpで名前を決めておくことで、routeヘルパで簡単にとってこれるので楽です。

resourcesviewspost_bbs.blade.php

@extends('layouts.app')

@section('content')
    <form action="{{ route('board.save') }}" method="POST" id="make_board" class="mt-3">
        @csrf
        <div class="form-group">
            <label for="board_title">タイトル</label>
            <input type="text" class="form-control" name="board_title" id="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" maxlength="140">
        </div>
        <div class="form-group">
            <label for="about_text">説明文</label>
            <textarea class="form-control" style="height:200px;" name="about_text" id="about_text"
                      maxlength="1024"></textarea>
        </div>
        <div class="form-group">
            <label for="password">パスワード</label>
            <input type="password" class="form-control" name="password" id="password" maxlength="20">
        </div>
        <div class="justify-content-center">
            <button type="submit" class="btn btn-primary mx-auto d-block col-3">作成</button>
        </div>
    </form>
@endsection

Boardモデルの編集

MakeBoardコントローラーのsaveメソッドでfillをつかって保存していますが、
fillをつかうときはモデルのfillableに対応するカラムを書いておかないといけないので書いています。
あと論理削除ができるように設定しています。

・・・省略・・・
class Board extends Model
{
    //
    use SoftDeletes;
    protected $fillable = [
        'title',
        'user_name',
        'about_text',
        'password',
    ];
    protected $dates = ['deleted_at'];
}

web.php の編集

web.phpを下記のように編集しました。
内容としては下記のようになります。
・/ にGETでアクセスされたときは TopPageコントローラのindexメソットを使う
・/post にGETでアクセスされたときは MakeBoardコントローラのindexメソットを使う
・/post/save にPOSTでアクセスされたときは MakeBoardコントローラのsaveメソットを使う

 ・・・省略・・・
Route::get('/', 'TopPage@index')->name("top.index");

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

動作確認

投稿する

上記までで投稿ページで投稿できるようになりました。
投稿ページにアクセスすると、MakeBoard@indexでviewが呼ばれて表示され、投稿ボタンを押すとMakeBoard@saveで投稿されます。

トップページを確認

トップページにアクセスすると登録したデータが一覧になって表示されるのが確認できます。
TopPage@indexが動作しています。

githubのこちら(example4)にソース置いてます。

コメント

  1. […] コントローラーについてはこんな感じで簡単に理解できると思います。 こちらに掲示板のサンプルを書いているので見てもらえるとわかると思います。 […]

タイトルとURLをコピーしました