フォームリクエストの使い方 [Laravel]
Laravelの「フォームリクエスト」はバリデーションの処理を専門に行います。コントローラーとバリデーションの処理を切り分けたい際に使用します。
![](../images/uploads/formrequest_1.png)
前提条件
// コントローラー ・app\Http\Controllers\Answer(s)Controller.php // ビュー ・resources\views\answers\index.blade.php |
があるものとします。※(s)は現場によって単数形、複数形が異なる。
1. フォームリクエスト
1-1. フォームリクエストのファイルを生成する
php artisan make:request HelloRequest
app\Http\Requests\HelloRequest.phpが作成される。
1-2. HelloRequest.php
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class HelloRequest extends FormRequest { public function authorize() { // 一致するパスのみバリデーションを実行する if ($this->path() == 'answers') { return true; } else { return false; } } public function rules() { return [ 'name' => 'required|max:50', 'url' => 'nullable|url|max:250', 'body' => 'required' ]; } public function messages() { return [ 'name.required' => '名前は必ず入力して下さい。', 'url.url' => 'ホームページに正しい形式を指定してください。', 'body.required' => '本文は必ず入力して下さい。', ]; } }
messages()でエラーメッセージを設定できるが、validation.phpを利用した方が良い。 エラーメッセージの日本語化 (validation.php)を参照。
1-3. コントローラー
storeの引数がRequestではなくHelloRequestになっている事を確認。
// 追加分 use App\Http\Requests\HelloRequest; public function store(HelloRequest $request) { // なんらかの保存処理 }
これだけでフォームリクエストによるバリデーションは完了です。
エラーがない場合はコントローラーの「何らかの保存処理」へ進み、エラーがある場合は自動的に前画面に戻って$errorsにエラー内容が設定されます。
2. おすすめのやり方
モデルでルールを定義する手法です。Ruby on Railsと同じです。
2-1. モデル
<?php namespace App; use Illuminate\Database\Eloquent\Model; // 追加分 use App\Rules\NgWord; class Answer extends Model { protected $guarded = array('id'); public static function Rules() { return [ 'name' => ['required','max:50', new NgWord('name')], 'url' => 'nullable|url|max:250', 'body' => ['required', new NgWord('body')] ]; } }
NgWordはカスタムバリデーションルールです。カスタムバリデーションルールを使用する際は[]で配列にする必要があります。
2-2. コントローラー
// 追加分 use App\Answer; public function store(Request $request) { // バリデーション $request->validate(Answer::Rules()); // なんらかの保存処理 }
スポンサーリンク
関連記事
公開日:2020年11月17日
記事NO:02855