Laravel 入門 ch4-2 バリデーション
フォームの作成とリクエストの受け取り方法
やること
- コントローラーの作成
- ビューの作成(お問い合わせ画面)
- ルーティング設定
コントローラーの作成
Php artisan make:controller FormController
※注意点
- 用意するアクション
- index(フォーム画面表示)
- post(リクエスト受信後の画面表示)
ビューの作成
resourceフォルダ以下にform.blade.php
を作成
※ 注意点
{{csrf_field()}}
の記述漏れ<form action=“/form">
のformの部分(post送信時のルーティングのパス名)
Route::post(‘form <= この部分',’FormController@post');
ルーティング設定
Route::get('form','FormController@index'); //フォーム画面表示 Route::post('form',’FormController@post'); //リクエスト受信後の画面表示
バリデーション
上記でフォームは完成だが、バリデーションしていないためどんな値でもpost送信される。 目的とは異なる値が入力された時は、getで「この入力は違うよ〜」って伝えたい。
バリデーションの流れはこんな感じ
最も簡単な方法はコントローラで処理を記述していく方法。
コントローラーの基底クラスに組み込まれているValidatesRequests
というトレイトに用意されているのでコントローラからバリデーション処理をしてあげるのが理解しやすい。
詳細まで詰めてみる(自分が気になった点)
- トレイトとは?
- 内部の実装について
トレイトとは?
PHPではクラスの多重継承ができない・・・
ということでPHP5.4から追加された機能がトレイト
//NG class Sample3 extends Sample1,Sample2 { } //OK (トレイトというまとまりにしてuseでインポートする) class Sample3{ use Sample1,Sample2; } //これ trait Sample1{} trait Sample2{}
内部の実装について
FormController.php(Controllerを継承) class FormController extends Controller Controller(ValidatesRequestsがインポートしている) class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; } ValidatesRequests(traitで定義されている) namespace Illuminate\Foundation\Validation; trait ValidatesRequests { public function validateWith($validator, Request $request = null) //省略 }
作成
FormController.php#post //ルールの設定 $validate_rule = [ 'name' => ‘required', 'email' => 'email' ]; //validateする(正しい:POSTで処理してもらって、次の画面へ 間違い:GET送信でフォーム画面に戻る) $this->validate($request, $validate_rule);
フィルターの種類(結構種類ある)
- required :フォームが存在かつ空白じゃない
- email :@がある
- numeric :数値
- between:0,100 :0~100まで
Method Illuminate\Validation\Validator::validateRequire does not exist.のエラーが出た場合
僕の場合はタイプミスだったので、打ち直したら直った。
//NG 'name' => ‘reqired’, //OK 'name' => ‘required',
このままでは、GETで元の画面には戻るがエラーメッセージが出ないのでエラーメッセージが欲しい。
エラーメッセージの表示
バリデーションの機能にフィルターにかかると$errors(配列)にエラーメッセージが入っていく
xx.blade.php
//$errorsにkeyがnameの値があれば、表示する @if($errors->has('name')) <p>{{$errors->first('name')}}</p> @endif <input name="name" placeholder="input name"> //$errorsにkeyがemailの値があれば、表示する @if($errors->has('email')) <p>{{$errors->first('email')}}</p> @endif <input name="email" placeholder="input email">
これだとエラーメッセージが英語で出力される。 日本語対応にしたい時はバリデーションをカスタマイズすることになる。 その場合、フォームリクエストを作成していく。
フォームリクエスト
コントローラの責務から極力フォーム内容のチェックは外したい。で外せるのでそれを試してみる。
作成
Http\Requests以下に作成
php artisan make:request ReqformRequest
用意されているメソッド
authorize
- フォームリクエストの許可をtrue or falseで返す
rules
- バリデーションルールを作成
Controller.php
use App\Http\Requests\ReqformRequest; //追記 //ReqformRequestを引数にとる(バリデーションされたrequestインスタンスを取得して、処理する) public function post(ReqformRequest $request){ $data = [ 'msg'=>'フォームを入力してください' ]; return view('reqform',$data); }
カスタマイズ
FormRequestの中のmessagesにはGet custom messages for validator errors.
と書かれている。ここいじればエラーメッセージをカスタムできるっぽいのでReqformRequestでmessagesをオーバーライドする。
FormRequest.php
* Get custom messages for validator errors. * * @return array */ public function messages() { return []; }
ReqformRequest
public function messages(){ return [ //‘項目名.ルール名’=>’エラーメッセージ' 'name.required'=>'名前を入力してください', 'email.email'=>'適切なメールアドレスを入力してください' ]; }
バリデーター
今まではフォーム入力に誤りが存在していたら、フォームページへリダイレクトするようになっていたが、違うページに飛ばしたい場合も出てくる。 その時バリデータを用意することでこれを実現することができる。
こういうのも使っていきたい。
Laravelが最初よりは徐々にわかってきた気がする。。
だが、Androidはいつやろうw