FormRequestに書くメリット
FormRequestに記載するメリットとしては以下の点がある
・Controllerに書くコード量が少なくなる、見やすくなる。
・ロジックを分けることができる
FormRequestの作成方法
以下のコマンドを実行するとapp/Http/RequestsディレクトリにFormRequestファイルが配置される。
$ php artisan make:request 任意のファイル名
ポイント
・命名は「アクション名+コントローラー名」とする。
PostControllerのstoreメソッドで使用したい場合は以下のように命名する。
$ php artisan make:request StorePostRequest
FormRequestの設定
・今回はバリデーションのルールとメッセージだけ設定していく。
class StorePostRequest extends FormRequest
{
// 認可条件を設定
public function authorize()
{
return true; // 認可します
}
// ルールを記述
public function rules()
{
return [];
}
// メッセージ
public function messages()
{
return [];
}
}
一つ一つ見ていく。
authorize()
・認可すべき条件があれば記述しtrue/falseを返す。
・特になければtrueを返しておかないとレスポンスは403Forbiddenとなる。
// 認可条件を設定
public function authorize()
{
return true; // 認可します
}
rules()
・バリデーションのルールを指定
・ルールを配列もしくは|で繋げて指定する
// ルールを記述
public function rules()
{
return [
//ルールを|で繋げる場合
"title" => 'required|string|max:100',
"mail" => 'required|string|max:100',
//ルールを配列で指定する場合
"title" => ['required','string','max:100'],
"mail" => ['required','string','max:100'],
//group = [
// [
// "name" => '中田',
// "age" => 22,
// ],
// [
// "name" => '山田',
// "age" => 22,
// ],
// [
// "name" => '山田',
// "age" => 22,
// ],
//]
//上記のようにrequestの中身が配列の場合
"group" => ['required','array'],
"group.*.name" => ['required','string','max:100'],
"group.*.age" => ['required','integer','max:3'],
];
}
messages()
・属性ごとに任意でメッセージを指定できる。
public function messages()
{
return [
'title.required' => 'タイトルの入力は必須です',
'title.string' => 'タイトルは文字列で入力してください',
'title.max' => 'タイトルは255文字までです',
//配列の場合
'group.*.name.required' => '名前は入力必須です',
'group.*.name.string' => '名前は文字列で入力してください',
];
}
Controllerで使用する際
引数にファイル名を指定することでControllerに入る前にバリデーションをかけてくれる。
public function store(StorePostRequest $request)
{
//保存処理
}
補足
・formを送信してバリデーションにかかった場合、iputタグに入力していた値などは消えてしまうためoldメソッドを使用する。
第二引数にデフォルト値(初期値)を指定することができる。
<input id="title" type="text" name="title" value="{{ old('title',$title) }}">
・以下のようにすることでバリデーションにかかった際にmessage()で指定したエラーメッセージが表示される。
@foreach($errors->get('title') as $message)
<li>{{ $message }}</li>
@endforeach