概要
FormRequest
クラスは、ユーザー権限の認証と入力のバリデーションを専用に扱う- 実装は、artisanで
FormRequest
クラスを継承したクラスを生成し、認証やバリデーションの内容を記述 - コントローラーのインジェクションを
Request
からFormRequest
の継承クラスに変更することで、チェック機能をコントローラーから分離することができる
準備
バリデーションで使ったアプリケーションを利用する。
ビュー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<h1>{{ $title }}</h1> <form method="post"> @csrf <p><input type="text" name="name" placeholder="ユーザー名"></p> <p><input type="text" name="handlename" placeholder="ハンドルネーム"></p> <p><input type="text" name="email" placeholder="メールアドレス"></p> <input type="submit" value="送信"> </form> <hr> @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach @if (isset($user)) <p>ユーザーネーム:{{ $user['name'] }}</p> <p>ハンドルネーム:{{ $user['handlename'] }}</p> <p>メールアドレス:{{ $user['email'] }}</p> @endif |
コントローラーのアクション
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function showValidation(Request $request) { $request->validate([ 'name' => ['required'], 'handlename' => ['required', 'max:10'], 'email' => ['required', 'regex:/^\w+@\w+$/'], ]); $user = [ 'name' => $request->input('name'), 'handlename' => $request->input('handlename'), 'email' => $request->input('email'), ]; return view('samples.validation_example_form', [ 'title' => 'バリデーションサンプル結果', 'user' => $user, ]); } |
フォームリクエストクラスの生成
以下のコマンドでFormRequest
を継承したクラスを作成する。
php artisan make:request リクエストクラス名
1 2 |
[vagrant@localhost laravel_tutorial]$ php artisan make:request RegistrationRequest Request created successfully. |
リクエストクラスは、app/Http/Requests
ディレクトリー下に作成される。
1 2 |
[vagrant@localhost laravel_tutorial]$ ls app/Http/Requests/ RegistrationRequest.php |
リクエストクラスの内容。ユーザー認証のためのauthorize()
メソッドと、バリデーションのためのrules()
メソッドが定義されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class RegistrationRequest 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 [ // ]; } } |
アクションの引数の変更
- コントローラーの先頭でリクエストクラスを
use
でインポート - コントローラーのアクションのメソッドインジェクションを
Request
からリクエストクラスに変更 validate()
メソッドはアクションには書かない
今回の例の場合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // リクエストクラスのインポート use App\Http\Requests\RegistrationRequest; class ValidationExampleController extends Controller { ..... public function showValidation(RegistrationRequest $request) { // バリデーションの記述は不要 $user = [ 'name' => $request->input('name'), 'handlename' => $request->input('handlename'), 'email' => $request->input('email'), ]; return view('samples.validation_example_form', [ 'title' => 'バリデーションの結果', 'user' => $user, ]); } } |
ユーザー認証の記述
準備中。認証された場合はauthorize()
メソッドの戻り値がtrue
。
バリデーションルールの記述
rules()
メソッドの戻り値の配列に、バリデーションルールを書く。
準備したコントローラーのバリデーション部分をリクエストクラスに記述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class RegistrationRequest extends FormRequest { public function authorize() ..... public function rules() { return [ 'name' => ['required'], 'handlename' => ['required', 'max:10'], 'email' => ['required', 'regex:/^\w+@\w+$/'], ]; } } |
エラーメッセージのカスタマイズ
フォームリクエストのmessages()
メソッドをオーバーライドすることで、メッセージのカスタマイズができる。