概要#
Laravel学習で自分がつまずいた部分を備忘録としてまとめています。
今回はフォームの入力内容の制限に関する記事です。
つまずいたポイント#
指定条件以外のフォーム入力を弾いてくれるバリデーション
。
そんなバリデーションですが、アクション事に毎回指定するのが面倒くさい。。
効率的な方法が無いか調べました。
どうやら、フォームリクエスト
なるものを使うと
一括でバリデーションを指定出来るとのこと。
バリデーションの復習もかねて、下記の2つを記事にしました。
①バリデーション####
②フォームリクエスト####
以下、記事内容です!
バリデーション#
まずはバリデーションの復習。
保存や編集などの、フォーム内容を受け取るアクション内で、
$this->validate($request,[条件]);
を入力。
第2引数の入力内容が、フォームの入力条件になります。
■コントローラ
public function store(Request $request) {
//バリデーションで条件を指定
$this->validate($request, [
'title' => 'required|min:3',
'body' => 'required'
]);
$post = new Post();
$post->title = $request->title;
$post->body = $request->body;
$post->save();
return redirect('/');
}
上記の場合だと、
title => 3文字以上 , body => 入力必須
て感じですね。
この条件以外の内容がフォームから送信されると、バリデーションが弾いてくれます。
フォームリクエスト##
次はフォームリクエスト
です。
バリデーションはアクション毎にフォームの入力内容を指定していましたが、
フォームリクエストではそれを一括で指定することが出来ます。
以下、手順です。
php artisan make:request PostRequest
フォームリクエストはphp artisan make:request 〜Request
で作成出来ます。
今回はPostRequestと名付けました。
作成したRequestはApp\Http\Requests
の中にあります。
■フォームリクエスト
//①
public function rules()
{
return [
'title' => 'required|min:3',
'body' => 'required'
];
}
//②
public function messages()
{
return [
'title.required' => 'タイトルを入力して下さい。'
];
}
フォームリクエスト上での主な指定内容は2つ。
1つは入力内容の条件、もう1つはバリデーションのメッセージです。
まずは入力内容の条件から。rulesメソッド
を使う事で条件指定できます。(①)
中身は先ほどのバリデーションと同じですね。
そしてmessagesメソッド
では、
バリデーション適用時のメッセージを指定する事ができます。(②)
デフォルトでは英文が指定されているので、わかり易くするには日本語に変えておいた方が良いかもですね。
■コントローラー
//①
use App\Http\Requests\PostRequest;
//②
public function store(PostRequest $request) {
$post = new Post();
$post->title = $request->title;
$post->body = $request->body;
$post->save();
return redirect('/');
}
コントローラでは、フォームリクエストをuseで使えるようにしましょう。(①)
そしてアクションの引数にフォームリクエストを入力。(②)
フォームリクエストで指定した内容が適用されるようになります。
バリデーションを書かないで良いので楽ですね。
フォームリクエストは以上です!
1.ターミナルからフォームリクエストを作成
2.フォームリクエストの条件を指定
3.コントローラ+アクションでフォームリクエストを適用
という流れですね。
ちなみに、何でアクションの引数にrequestを入れるだけでフォーム内容が受け取れるのか?
疑問に思って調べましたが、「サービスコンテナ」やら「メソッドインジェクション」やら「DI(Dependency Injection = 依存性注入)」なる単語まで出てきて、脳がフリーズしたので一旦忘れます。いつかちゃんと調べて記事にします。多分。。。
まとめ##
以上、Laravelでフォームの入力内容を制限する方法でした。
最後まで読んで頂きありがとうございました。
フォームリクエストの方がコードの量が少なくなるので楽ちんですね。