概要
実務で、久しぶりにFormRequestクラスを使ったバリデーションの設定を行った際、仕組みを忘れていたので備忘録として記事にまとめてみます。
FormRequestクラスの作成方法
1から自分でクラスを作成することも可能ですが、コマンドを打って作成する方が楽。
php artisan make:request TargetCostRateRequest
このコマンドを入力することで、以下のファイルが作成される。
class TargetCostRateRequest extends FormRequest
{
public function authorize()
{
return false;
}
public function rules()
{
return [
//
];
}
Requestファイルについて
authorize()
authorize()メソッドはユーザーがフォームリクエストを実行する権限を持っているかどうかを判定するメソッド。
trueなら実行権限を持っている。falseなら持っていない、ということになるが、基本的にはtrueに書き換える。
rules()
rules()メソッドはフォームフィールドに対するバリデーションルールを定義する。
定義方法は文字列形式と配列形式の2種類がある。
基本的な使い分けとしては、複数の複雑なルールやカスタムルールクラスを使用する場合、配列形式の方が柔軟性が高く、コードが見やすくなる点にある。
注意
自分が実務でハマってしまったのは、配列に定義するキー名なのですが、
ここには、Bladeファイルで設定したname属性をそのまま設定します。
そのため、以下のソースコード内の'title'と'body'はBladeファイルのname属性として設定されている名前ということになります。
-文字列形式
public function rules(): array
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required|string',
];
}
-配列形式
public function rules(): array
{
return [
'title' => 'required|unique:posts|max:255',
'body' => [
'requrired',
// カスタムバリデーションの呼び出し
new CustomValidationClass(),
],
];
}
上述した2つはコマンドで作成するとデフォルトで用意されているメソッドだが、他にもある。
個人的によく使うメソッドを追加でまとめる。
attributes()
バリデーションでデフォルトのエラーメッセージを表示すると、その属性名が表示される。
attributesを編集することで、この属性名を好きな値に変更することができる。
public function attributes()
{
return [
'start_date' => '開始年月',
'end_date' => '終了年月',
];
}
messages()
messages()には、任意のエラーメッセージを定義することができる。
※これを設定しなくても勝手にエラーメッセージは出る。
また、'attribute名.ルール'の形式で記述することで、rules()で設定したルールの内容をメッセージに反映させることもできる。
public function rules(): array
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required|string',
];
}
public function attributes()
{
return [
'title' => '題名',
'start_date' => '開始年月',
'end_date' => '終了年月',
];
}
public function attributes()
{
return [
'required' => ':attributeは、必須項目です。',
'gte:0' => ':attributeは0以上を指定してください。',
// rules()で設定したルールの内容をメッセージに反映させることもできる
'title.max' => ':attributeは最大:max文字以内で入力してください。'
// 出力:題名は最大255文字以内で入力してください。
];
}
最後に
簡単でしたが、FormRequestクラスでバリデーションを設定する方法をまとめてみました。
FormRequestクラスを使うやり方以外にも、Controllerにべた書きする方法等もあるみたいです。(私はやったことがないですが、、)
最後までお読みいただきありがとうございした。
間違いや指摘等がありましたら、ご連絡いただけると幸いです。
以上