2015.10.2
0からはじめるPHP#43【アジャイルで作る掲示板#4-条件付きバリデーション-】
プライベートの作業を午前中に回すと、かなりやりやすいですね。
ということで、今回は
条件付きバリデーションという新たな知識を使うことになったので、それをご紹介しようかと思います。
投稿フォームを作っているところなのですが、バリデーションを用いてこのようなエラー表示が簡単にできてしまいます。
さて、この実装を考えてみましょう。
注目すべきは
文字色です。
ラジオボタンのチェック状況の保持方法がわからないため、画像ではちょっとチェックされてないんですけど、本来は一番右のラジオボタンにチェックが入っている状況です。
見れば分かると思うのですが、文字色を自分で指定することもできるというシステムにしてみようかと思います。
もちろん、この欄にバリデーションを適用するのですが
果たしてチェックが入っていない時にバリデートする意味はあるのでしょうか。
別にチェックが入っていなければ使わないので、怪しい文字列が入力されてようと関係ないですね。
ということで
文字色指定にチェックが入っている時のみバリデートというのはどうしたら良いのでしょうか、と。
$input = $request->all();
$v = Validator::make($input, [
'名前' => 'required|no_ctrl_chars|max:256',
'メール' => 'no_ctrl_chars|max:256',
'URL' => 'no_ctrl_chars|max:2000',
'件名' => 'required|no_ctrl_chars|max:256',
'文字色' => ["required",'regex:/[0123456789aAbBcCdDeEfF]{6,6}|free/'],
'本文' => 'required|no_ctrl_chars|max:5000',//とりあえず5000文字で制限しておく。
]);
$v->sometimes('色コード', ['required','regex:/[0123456789aAbBcCdDeEfF]{6,6}/'], function($input) {
if($input["文字色"]=="free"){
return true;
}
});
if ($v->fails()) {
return back()
->withErrors($v)
->withInput();
}
※no_ctrl_charsルールはこちらを参考に追加がやっとできました。
2.のValidator::extendを追加するところでuse Validator;とファサードを追加することで動きます。どこにも解説されてないので注意です。
(更に追記):実はそれだけだと日本語に非対応です。#57で解説しています。
このようなオーダーに対応するにはValidatorインスタンスを作る必要があります。まぁ多少記述量は増えますがやってることは対して変わりません。
エラー文章を日本語で表示させるためにフォームのname属性は日本語で記述してあります。カスタムエラーメッセージはまだちょっと使い方が理解できてないので今回はちょっと逃げさせてもらいます。
さて、条件付きバリデーションは、見れば分かると思いますが11行目の部分ですね。
バリデーションルールにsometimesは存在するのですが、インスタンスを生成するともっと複雑な条件が指定できます。
どのように条件を指定するのかというと
クロージャーがtrueを返す時にバリデーションが適用されるという風に指定できればなんでもいいです。
もしかしたらif文は要らなかったかも知れませんが、まぁ分かりやすい方がいいかな。
とりあえず"文字色"フィールドにfreeが指定されている時のみ、色コードはrequired、regexルールが適用されることになります。
これで作れるバリデーションは幅広くなるかと思います。
こういったバリデーションは自前でやるとだいぶしんどいので(特にエラーメッセージ表示まわりは多分ヤバい)フレームワークの力を借りて実装しましょう!そのほうがセキュリティ的にも安全なんじゃないかなーとか思ってます。