こんにちは、のるぼるのんです。今回もLaravel5.6, 5.7の機能を紹介していきます!
LaravelのRequestはデフォルトでHTTPリクエストをバリデーションするValidatesRequestトレイトを使用しているので、バリデーションルールを簡単に使用出来ます。
というわけで、早速やっていきましょう!前回の記事(論理削除を実装する)の内容でmembersテーブルにデータを入力していきます。
リソース、コントローラー、モデルはこんな感じ。
create.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<form method="POST" action="/members"> {{ csrf_field() }} <div> <label for="name">名前</label> <input type="text" name="name" required> </div> <div> <label for="position">ポジション</label> <input type="text" name="position" required> </div> <div> <label for="height">身長</label> <input type="number" name="height" required> </div> <div> <input type="submit" value="送信"> </div> </form> |
送信するのは名前、ポジション、身長です。全てrequiredをつけています。
Member.php
1 2 3 4 5 6 7 8 9 10 11 |
class Member extends Model { use SoftDeletes; /** * 複数代入する属性 * * @var array */ protected $fillable = ['name', 'position', 'height']; } |
$fillableにfill()メソッドで自動入力する項目を設定しています。
MembersController.php
1 2 3 4 5 6 7 8 9 |
/* * create member */ public function store(Request $request) { Member::create($request->all()); return redirect()->to('members'); } |
createメソッドにデータを渡すことで、fill()->save()しています。
で、今のままだと、以下の問題があるわけです。
name(必須) : 文字数制限を超えるとエラー。
position(必須) : 文字数制限を越えるとエラー。
height(必須) : 負の値を送信でエラー。4桁の身長が保存できる。1桁の身長でも保存できる。
普通にバリデーションルールを記述。
MembersController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* * create member */ public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:100', 'position' => 'required|string|max:255', 'height' => 'required|numeric|digits_between:2,3', ]); Member::create($validated); return redirect()->to('members'); } |
こんな感じですかねー。
maxで最大値を記述。numericで数値のみ許可。digits_betweenで桁数を指定。今回はこのままでも良いのですが、コントローラーに記述が多くなるのと、他の部分にも同じバリデーションを適応する場合、編集漏れなどの問題があります。ですのでFormRequestを使用して、バリデーションルールを個別化しましょう。
FormRequestを使用する
FormRequestを作成
1 |
php artisan make:request MembersRequest |
FormRequestを編集
MembersRequest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class MembersRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required|string|max:100', 'position' => 'required|string|max:255', 'height' => 'required|numeric|digits_between:2,3', ]; } } |
コントローラーの代わりに作成したFormRequestにバリデーションルールを記述します。
MembersController.php
1 2 3 4 5 6 7 8 9 10 11 |
use App\Http\Requests\MembersRequest; /* * create member */ public function store(MembersRequest $request) { Member::create($request->validated()); return redirect()->to('members'); } |
FormRequestを使用することで、コントローラーに記述しなくてもバリデーション、リダイレクトバックを行ってくれます。
バリデーション済みのデータの呼び出しにはvalidated()メソッドを使用します。
これでコントローラーの簡略化、使い回しが出来るようになりました。
カスタムメッセージ、バリデーションルールの追加など、様々機能がありますので、そちらもそのうち紹介したいです。
コメントを書く