タイトル通りで一度作ったけど細かいこと忘れたといった時の為の自分用のメモです。FormRequestが何なのかといった説明はしていません。
FormRequestの準備
FormRequestを作る
次のコマンドでFormRequestを作ります。app/Http/RequestsにSampleRequest.phpという名前でファイルが作られます。
php artisan make:request SampleRequest
作ったFormRequestをControllerで使う
最初はこうなっている所を
public function store(Request $request)
こう変更します。依存性注入(DI)というので勝手にインスタンスを作成してくれるそうです。
public function store(SampleRequest $request)
Controllerでuseするのも忘れずに。
use App\Http\Requests\SampleRequest;
FormRequestの実装
FormRequestを作成した直後はこんな感じになっています。
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 SampleRequest 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 [ // ]; } } |
authorizeメソッドの修正
認証用のチェックです。trueを返さないとエラー終了するのでtrueに変更します。
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 SampleRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ]; } } |
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 31 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class SampleRequest 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 [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; } } |
attributeメソッドの作成
このままだと例えばtitleを入力しなかった場合のエラーメッセージは次の様になります。
titleは必ず指定してください。
これを次の様なメッセージにするにはattributeメソッドを作成します。
タイトルは必ず指定してください。
以下は一例です。
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 31 32 33 34 35 36 37 38 39 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class SampleRequest 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 [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; } public function attributes() { return [ 'title' => 'タイトル', 'body' => '内容', ]; } } |
その他
バリデーションの前後で何か処理を加えたい時に使えるメソッドがいくつかあります。
prepareForValidation
バリデーションの前に実行されます。あまり意味はないですが以下の例ではタイトルと内容にラベルとなる文字を付けてます。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class SampleRequest 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 [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; } public function attributes() { return [ 'title' => 'タイトル', 'body' => '内容', ]; } protected function prepareForValidation() { $this->merge([ 'title' => 'タイトル:' . $this['title'], 'body' => '内容:' . $this['body'] ]); } } |
validationData
ここでreturnしたデータがバリデーションに使われます。prepareForValidationと似てますが、一時的に値を変更してバリデーションしたい場合はこちらを使い、元データそのものを変更したい時はprepareForValidationを使うという事かなと思いました。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class SampleRequest 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 [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; } public function attributes() { return [ 'title' => 'タイトル', 'body' => '内容', ]; } public function validationData() { $data = $this->all(); $data['title'] = 'タイトル' . $data['title']; $data['body'] = '内容' . $data['body']; return $data; } } |
passedValidation
バリデーションを通過した後に呼ばれるメソッドです。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class SampleRequest 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 [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]; } public function attributes() { return [ 'title' => 'タイトル', 'body' => '内容', ]; } protected function passedValidation() { $data = $this->all(); $data['title'] = 'タイトル' . $data['title']; $data['body'] = '内容' . $data['body']; return $data; } } |