入力フォームからの Request をバリデートする。 FormRequest を利用すると Controller に処理を記述しなくても事前にバリデートしてくれる。
$ php artisan make:request UserStoreRequest
app/Http/Requests/ にファイルが作成される
class UserStoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; //デフォルトで false になっている
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
//バリデートのルールを記述
return [
'name' => ['required', 'min:3', 'max:64', 'unique:users'],
'email' => ['required', 'min:4', 'max:255', 'unique:users'],
'password' => ['required', 'min:4', 'max:16'],
];
}
public function messages(){
//rules に対応したメッセージを記述
return [
'name.required' => '名前を入力してください。',
'name.min' => '名前は3文字以上で入力してください',
'name.max' => '名前が長すぎます',
'name.unique' => '名前は既に登録されています',
'email.required'=> 'Emailを入力してください。',
'email.min' => 'Emailが短かすぎます',
'email.max' => 'Emailが長すぎます',
'email.unique' => 'Emailは既に登録されています',
'password.required'=> 'パスワード入力してください。',
'password.min' => 'パスワードは4文字以上で入力してください',
'password.max' => 'パスワードは32文字以内で入力してください',
];
}
}
引数のクラスを Request から UserStoreRequest に変更すると FormRequest が自動的にバリデート処理をする validate エラーが発生すると、即時に全画面にリダイレクトする
public function store(UserStoreRequest $request) //UserStoreRequest にクラス名を変更
{
//UserStoreRequest で validate エラーが発生すると、以降の処理は実行されない
$request->session()->put('request', $request->all());
try {
User::create($request->validated());
return redirect('user');
} catch (QueryException $e) {
return back()->withInput();
}
}
FormRequest で発生したエラーは、自動バインドされた $errors で記述する。
@if (count($errors) > 0)
@foreach ($errors->all() as $error)
- {{ $error }}
@endforeach
@endif
UPDATE で 自分自身はユニークを除外する必要がある場合、Rule::unique() を利用する。
use Illuminate Validation Rule;
.....
public function rules()
{
return [
'name' => [
'required', 'min:3', 'max:64',
Rule::unique('users')->ignore($this->id),
],
'email' => [
'required', 'min:4', 'max:255',
Rule::unique('users')->ignore($this->id),
]
];
}