ラボ > FuelPHP:validation

Fuelphpの配列要素のバリデーション

「name=chk[]」みたいなヤツをバリデーションしたいとき。全部指定するかクロージャーで指定するか。

作成日:2018-07-19, 更新日:2018-08-30

基本

配列要素のバリデーションの方法は下記あたり。
・全要素指定する
・クロージャーを使う
・手動でゴニョゴニョする

全要素指定する

$aryData = \Input::post(〇〇〇);
  if ( is_array($aryData) ) {
    foreach( $aryData as $i=>$rowData ) {
      $validation->add('〇〇〇' . $i, 'ラベル名')
                 ->add_rule('required');
    }
  }

クロージャー

基本的にクロージャーを理解していないから・・・よく分からない。

$validation->add('〇〇〇', 'ラベル名')
           ->add_rule('required')
           ->add_rule(function($aryData) {
             
             // $aryDataが配列要素だから、count()など好き勝手する
             if ( 条件 ) {
                \Validation::active()->set_message('closure', 'エラーメッセージを設定');
                return false;
             }
             
             return true;
           });

配列以外でクロージャー

ログインチェックも行えるようだ。

▼「name=loginId」と「name=loginPwd」からログインさせる場合

$loginPwd = \Input::post('loginPwd', ''); // 「name=loginPwd」の値を格納

$validation->add('loginId', 'ログインID')
           ->add_rule('required')
           ->add_rule(function($loginId) use ($loginPwd) {
             
             // $loginIdと$loginPwdをチェックしてログイン成功するか確認
             if ( 条件 ) {
                \Validation::active()->set_message('closure', 'ログイン失敗');
                return false;
             }
             
             return true;
           });

クロージャーのメモ

\Validation::active()->set_message('closure', エラーメッセージ);

「set_message()」の引数の一つ目を「closure」としているが、コレは固定。他だとダメっぽい。

処理を別に記載

あまり処理を一か所に固めるのが好きじゃなくて別関数にしておきたい。
良い方法が分からないので無理やりやってみる。

$validation->add('〇〇〇', 'ラベル名')
           ->add_rule('required')
           ->add_rule(function($aryData) {
             $err = chk〇〇〇($aryData);
             if ( $err != '' ) {
                \Validation::active()->set_message('closure', $err);
                return false;
             }
             return true;
           });

// ===================
// 好きな場所で関数指定
function chk〇〇〇($iptData) {
  
  if ( 条件 ) {
    return エラーメッセージ;
  }
  
  return '';
}

手動でゴニョゴニョする

▼流れ
1.手動で配列のチェックをして、エラーがあればエラー文作成。
2.エラー文があればバリデーションエラー扱いにする。

$iptData = \Input::post(〇〇〇, false);
$tmpIpt[_〇〇〇] = '';
if ( !is_array($iptData) || count($iptData)==0 ) {
  $tmpIpt[_〇〇〇] = 'xxxxを指定してください';
}
$validation->add(_〇〇〇, 'xxxx')
           ->add_rule('force_error', $tmpIpt['_〇〇〇']);

※「force_error」は個人的に作った強制的にエラーにするヤツ→「FuelPHPで独自のvalidationルールの作成」の「複雑なルールにするとき」ってトコ。
※最終的な出力時の注意→エラー文は「〇〇〇」じゃなく「_〇〇〇」にセットしている。

関連項目

FuelPHPで独自のvalidationルールの作成