Laravel
Laravelのフォームマスターに、俺はなる!
うどん
更新日:2021/07/01
みなさまこんにちは。
Laravel歴4ヶ月の初心者、うどんです。
ひょんなことからITdept.配属になって早くも半年。
といってももともとはWEB担だったのではじめはITらしいことをせず、最近になってITっぽいことをはじめだした人間です。
そんな私が最初に担当したシステムがWEBで馴染みもあったこともあり、かんたんなフォームを扱うものだったのですが、調べれば調べるほど、いろいろと出てきまして・・・。
知らないことが大量発生するわけですよ。
ということで、自分の備忘録をかねて、いろいろ記録していくことにしました。
そもそもの環境
私が実行しているのはLaravel6.2のバージョンになります。
バージョンの違いによって非対応といったものがあると思うのですが、そちらは予めご了承ください。
ユーザが見える(操作する)側のフォームのパターン
フォームを作るためにできるのは大きくは2パターン。
- HTMLタグで作成する
- FORMブレードで作成する
それぞれ解説していきます。
HTMLタグで作成する
もともとWEB担当だったのでHTMLタグでフォームを作る方法には慣れ親しんでいたのですが、actionがPOSTの場合、少し注意しなければならない点がありました。
というのがLaravelのPOSTアクションではCSRF対策が必須!
そのため、送信するForm内には以下のどれか等を入れる必要があります。
- @csrf、もしくは{{ csrf_field() }}
- <input type="hidden" name="token" value="<?php echo $_SESSION ["TOKEN"] ?>">
↑これはAjax通信で必要になるやつみたいですね。
FORMブレードで作成する
LaravelにはFORMブレードというものが存在しています。
FORMブレードとは?といった方のために簡単に紹介すると、{{ Form::open([‘url’ => ‘/’]) }}ではじまり、{{ Form::text(‘name’, null, [‘placeholder’=>’名前を入力’]) }}等でinput要素を作り、{{ Form::close() }}で終わらせるといったものです。
この記事がとても参考になりました。
【Laravel】初めてのフォーム作成
https://qiita.com/manbolila/items/b364088e821f4c946229
上記の記事でも書いてあるのですが、FORMブレードを使用する際は『laravelcollective』が必須となるのでご注意ください。
受け取ったrequestをvalidateするパターン
フォームから送信されたデータをvalidateするのには3つの方法があります。
- controllerに直書きする
- formrequestを作る
- ruleを作って1.2.に入れる
controllerに直書きする
Controllerで直書きする方法はRequestを受け取ったメソッド内で、「$request->validate([バリデーション内容],[エラーメッセージ]);」を入れることで使うことができます。
一例をちゃんと書くなれば、Controller内に以下を入れることで実行できます。
- public function store(Request $request){
- $request->validate([
- 'name' => 'required',
- 'mail' => 'required',
- ],
- [
- 'name.required' => 'ユーザー名を入力ください。',
- 'mail.required' => 'メールアドレスを入力ください',
- ]);
- //ここにはvalidate後の処理を書く
- return redirect()->route('mainpage')->with(['complete' => '登録が完了しました。']);
- }
こんな感じをイメージしてもらったらいいかと思います。
formrequestを作る
同じvalidate内容を数回使う場合、FormRequestを作っておくとめちゃくちゃラクになります。
FormRequestを作る際は「php artisan make:request 名前」をLaravelのターミナル内で実施し、生成されたFormRequestを書き換えていくと完成します。
この記事がとても参考になりました。
Laravel : FormRequestクラスを使ってValidation(MyMemo)
https://qiita.com/daisu_yamazaki/items/e44d4b744d9d5f9bc8b3
ちなみにFormRequestはrulesの記述でいきなりreturnで返すのではなく、以下のようにifで読み込む要素を指定すると使い回すことができます!
- public function rules()
- {
- $rules = [];
- $rules = [
- 'name' => 'required',
- 'mail' => 'required|email|confirmed',
- ];
- if ($this->has('tel')) {
- $rules['tel'] = 'required';
- }
- return $rules;
- }
ruleを作って1.2.に入れる
ほかのシステムでも使いまわしたいvalidateってありますよね。(例:半角英語表記)
そういった際にはruleを作ってしまっておくと、別システムの際は同じルールのファイルをコピペするだけで、使い回すことができて時短になります。
ただこのruleを作って使う場合は、作ったあとに1.か2.のパターンでruleを追加して使う必要があるのでお忘れなく。
この記事がわかりやすいです。
【laravel】ruleオブジェクトによる検証ルールの追加
https://qiita.com/gone0021/items/7374293c270a99bbf6d8
CRUD処理のパターン
CRUD処理に対しては2パターン。
DBクエリを使うか、Eloquentを使う。
DB::table(‘users’)->insert(内容)であるかMDL::create(内容)であるかって感じですね。
これに関してはどちらもほぼ一緒であり、特記できるようなことがないので割愛します。
その他フォームのときにしたくなること
私が今回アホほど調べたこと。
それはフォームって入力して送信したあと、ブラウザの戻るで押したら履歴残ってたらまた送信できちゃうじゃないですか。
なんでそんなのを発生させたくなかったんで、ちょっと調べたとき
Sessionをクリアしたり、トークンの再発行でできると思ったんですが、これが同じページにリダイレクトしてたら効かないことがわかりました。
え、じゃあどうしよ?
と思い調べたらそもそもまずなんでこの表示があるのかを調べると
フォームに下記を加えたら大丈夫なことがわかりました。
autocomplete=”off”
ですが、これ入れると、自動予測機能はもちろん機能しなくなるんですよね。
一度しか実行されないユーザー登録側とかはこれでもいいと思うんですが、社内システムで同じようなこと繰り返すことがあるフォームにはこれではなく、ページが表示される際に一度リセットがかかるよう処理(jQuery)を加えました。
- //ブラウザバックでフォーム初期値
- $(window).on('pageshow', function() {
- let form_num = $("form").length;
- for (let i = 0; i < form_num; i++) {
- $("form")[i].reset();
- }
- });
(↑ちなみにこのコードはページ内に複数のFormがあることを想定して作ってます。)
この方法でブラウザバックで戻った際には履歴が消されているので2重送信の可能性はないですし、フォームの履歴入力ができるので同じ内容を入力することもできる!
やりたい形になりました。
まとめ
初Laravelで初フォーム作りで多次元配列を扱ったりもしたのでエラーを発生させまくったりといろいろと苦戦したのですが、なんとか形になって本当によかったです。
これからシステム制作でフォーム制作が発生しても怖くないので、フォームマスター(自称)と名乗ってみたいなと思います。
それではまた!