こんにちは。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/
技術的ポイント
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を付けておくと...
// 掲示板一覧[トップ]
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 action="{{ route('board.save') }}" method="POST" id="make_board" class="mt-3">
<div class="mt-3 mb-3 row justify-content-end">
<a href="{{ route('board.index') }}" class="btn btn-primary mr-3">新規登録</a>
</div>
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を積極的に使って行きたいと思います!