今回の題
Laravelのバリデーションで用いるフォームリクエストという機能を解説、まとめた記事です。
ググればたくさん情報が出てきますが、自分の言葉でまとめておきたかったので筆を取りました。
間違いや注意点などありましたらコメントにお願いします🙇♀️
検証したバージョン
Laravel 7.30.0
フォームリクエストを利用するには
フォームリクエストの作成
プロジェクトデイレクトリで以下のコマンドを打つと、app/Http/RequestにStoreBlogPostクラスが作成されます。
$ php artisan make:request StoreBlogPost
メソッドにDIする
コントローラーにリクエストを受け取りその内容を保存するstoreというメソッドがあったとします。
public function store(Request $request)
{
// 保存処理
}
そのメソッドのRequestクラスをDIしている箇所を、先ほど作成したStoreBlogPostクラスに置き換えれば、保存処理の前にフォームリクエストに定義したバリデーションが適応されるようになります。
public function store(StoreBlogPost $request)
{
// 保存処理
}
使い方
フォームリクエストは初期状態だと以下のようになっています。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreBlogPost extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
定義されているメソッドは2つ、
authorize()
リクエストを行ったユーザーの権限を確かめるメソッドです。
falseを返すとアクセスが拒否されたことを示す403エラーを吐き、
trueを返すと認可してバリデーションを行います。
認証をコントローラーやポリシーなどで行っている場合は恒常でtrueを返しておきます。
public function authorize()
{
return true;
}
rules()
バリデーションのルールを記載するメソッドです。
前提として以下のようなformがあったとします。
<form action="" method="POST">
<input type="text" name="title">
<textarea name="body"></textarea>
</form>
この内容に対して適当なバリデーションをあててみます。
public function rules()
{
return [
'title' => 'required | unique:posts | max:255',
'body' => 'required',
];
}
上記のように'項目名' => 'ルール'の形で記入し、ルールが複数あるときは|を使い'ルール|ルール'といった具合に書きます。
このコードで各項目にあてられたバリデーションは以下のようになっています。
-
title
入力必須
postsテーブルにてユニークな(重複しない)値
255字以内 -
body
入力必須
使用できるルールはここで確認できます。
オーバーライドして使用できるメソッド
attributes()
バリデーションメッセージ内に表示される項目名はそのままだとtitleやbodyのままですが、このメソッドから任意の名前にカスタマイズすることが可能です。
public function attributes()
{
return [
'title' =>'タイトル',
];
}
messages()
バリデーションで弾かれた場合、ユーザーはバリデーションメッセージを抱えた状態で直前のページにリダイレクトされます。
その時のメッセージをカスタマイズするメソッドです。
public function messages()
{
return [
'title.required' => 'タイトルは必須です',
'title.unique' =>'既に存在するタイトルです',
];
}
上記のように項目名.ルールの形で記入します。
prepareForValidation()
バリデーション前にデータを加工する際に用いるメソッドです。
protected function prepareForValidation()
{
$this['user_id'] = Auth::id();
}
例としてリクエストにログインユーザーのidを追加してみました。
配列に対してバリデーションを行う
おまけです。
前提として以下のような画像複数枚を配列で送信するformがあるとします。
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="images[]">
<input type="file" name="images[]">
<input type="file" name="images[]">
</form>
この配列の一つ一つにバリデーションを行うには以下のようにします。
public function rules()
{
return [
'images.*' => 'image | mimes:jpeg,png,jpg'
];
}
全部に同じルールを適応するのであれば'項目.*'とし、一つ一つに行うのであれば項目.配列の添字番号とします。
参考
Illuminate/Foundation/Http/FormRequest.php
readouble
一言
何か面白いメソッドないかとソース見ましたが、特になかったためほぼreadoubleに乗っている内容になりました🚗