Help us understand the problem. What is going on with this article?

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

技術的ポイント

FormRequestを使ってみた

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

・バリデーション用のフォームリクエストです。


BoardCreateRequest.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文字以下で入力してください。'
        ];
    }
}


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

    /**
     * 新規掲示板保存
     * @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を付けておくと...

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ヘルパで下記のように楽に呼び出せるのでいい感じです。

formタグの箇所
<form action="{{ route('board.save') }}" method="POST" id="make_board" class="mt-3">
linkタグの箇所
    <div class="mt-3 mb-3 row justify-content-end">
        <a href="{{ route('board.index') }}" class="btn btn-primary mr-3">新規登録</a>
    </div>
redirectの箇所
 return redirect()->route("top.index");

formの入力箇所にはoldを入れよう

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

投稿フォームの一部
        <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で掲示板を作ってみる(5)
Laravel5.8で掲示板を作ってみる(4)
Laravel5.8で掲示板を作ってみる(3)
Laravel5.8で掲示板を作ってみる(2)
Laravel5.8で掲示板を作ってみる(1)

他にやりたかったこと

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

終わりに

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away