ちょっと前までjQueryで書いていたバリデーション処理をPHPに移行しました。
フィールド名で処理できるのはよいです。私はこっちのほうが気に入りです。
基本
// バリデーションクラスをインスタンス化
$val = Validation::instance();
// emailカラムにバリデートを設定
$val->add('email', 'メールアドレス')
->add_rule('required')
->add_rule('valid_email');
// 何も引数を指定しなかった場合、デフォルトで$_POSTが引き渡される
if($val->run()){
// バリデーション成功の場合ここに入ってくる
}else{
// バリデーション失敗の場合ここに入ってくる
foreach($val->error as $key=>$value){
// $key:'email'
// $value:エラー
// $value->get_message():エラーメッセージ
}
}
ちなみにデフォルトのvalid_emailの中身はfilter_var($val, FILTER_VALIDATE_EMAIL)
とかで実はあんまりうまくないので、以下の独自バリデーションで上書きしちゃうことをおすすめします。
さっきまでドはまりしていたので自戒も兼ねて。
独自バリデーション
ただのクラスなのでどこにでも置けます。個人的にはapp/class/validate/の下に置くのが好き。
extension.php
class Validate_Extension {
// メソッド名に注意
// _validation_hoge
public static function _validation_hoge($val){
Validation::active()->set_message('hoge', 'ほげチェックエラー');
// 正規表現やデータベースアクセスなどによる操作が可能
// trueが正常系(書式との一致)。
return $bool;
}
}
独自バリデーションの読み込み
// バリデーションクラスをインスタンス化
$val = Validation::instance();
// 拡張バリデーションクラスを呼び出し
$val->add_callable('Validate_Extension');
// ルールとして利用可能に
$val->add('email', 'メールアドレス')
->add_rule('required')
->add_rule('valid_email')
->add_rule('hoge');
// 何も引数を指定しなかった場合、デフォルトで$_POSTが引き渡される
if($val->run()){
// バリデーション成功の場合ここに入ってくる
}else{
// バリデーション失敗の場合ここに入ってくる
foreach($val->error as $key=>$value){
// $key:'email'
// $value:エラー
// $value->get_message():エラーメッセージ
}
}
ところでバリデーション処理ってどこに書くのが正しいのでしょう。
ControllerなのかPresenterなのかModelなのか…。