FuelPHPで配列のバリデーションを行う場合はいくつかパターンがあるのでここで紹介します。
パターン1:配列の要素毎にバリデーションルールを設定
Validationインスタンスのadd/add_fieldメソッドで配列の要素を一つずつ設定することが出来ます。
要素一つ一つの形式をチェックしたい場合はこの方法が良いと思います。
例.
$validation = Validation::forge();
$options = Input::post('option');
if (is_array($options)) {
foreach ($options as $i => $v) {
// 要素毎にバリデーションルール設定
$validation->add_field("option.$i", 'オプション', "required|numeric_between[1,10]");
}
}
$validation->run();
return $validation->error_message();
上記のように配列要素は「{パラメータ名}.{配列キー}」で指定します。
または「"option[$i]"」のように「{パラメータ名}[{配列キー}]」の書き方でも構いません。
パターン2:closureを使用
closureって何ぞや?という方はこちらを参考に。
closureは要素毎の形式ではなく、配列全体もしくは他要素と関連するバリデーションを行う場合に向いています。
例えば以下は配列の要素の数や要素の値の重複をチェックしています。
$validation->add('option', 'オプション')
->add_rule('required')
->add_rule(function($options) {
// 3つ以上選択してるか
if (count($options) < 3) {
Validation::active()->set_message('closure', 'オプションは3つ以上選択してください');
return false;
}
// 値が重複してないか
$unique_options = array_unique($options);
if (count($unique_options) != count($options)) {
Validation::active()->set_message('closure', 'オプションの値が重複しています');
return false;
}
return true;
});
$validation->run();
return $validation->error_message();
ケースによってはどちらとも使うこともあります。
どのようにバリデーションを行いたいか、またはどのようにエラーを表示したいかによって使い分けると良いでしょう。