PHPのvalidate処理実装
validate処理
- frameworkには必ずといっていいほど含まれているvalidate処理。独自に簡単な処理を書いてみた。
- validateは処理の型が決まっているので、interfaceを用意し、個別のvalidateクラスを実装する。
interface
validateのinterfaceを定義
<?php interface Validate { public function execute( $param, $format ); }
各validate処理
interfaceで定義したexecuteメソッドの本実装を行う。ここではStirng,Length,Regexを定義するが同様にクラスを追加すれば簡単にvalidateが実装できる。
<?php class StringValidate implements Validate { public function execute( $param, $flag ) { if( is_string( $param ) !== $flag ) { return false; } return true; } } class LengthValidate implements Validate { public function execute( $param , $length ) { if( mb_strlen( $param ) > $length ) { return false; } return true; } } class RegexValidate implements Validate { public function execute( $param , $regex ) { if( !preg_match( $regex, $param ) ) { return false; } return true; } }
validateManager
clientから呼び出され、各validateのexecuteメソッドを呼び出す。
<?php class ValidateManager { static private $params_ = array(); static public function init() { //本来はここで$_POSTなどから取得する self::$params_ = array( 'aaaa' => 'sampletest' ); } static public function execute( $form ) { self::init(); foreach( $form as $key => $valide ) { foreach( $valide as $type => $format ) { $class = ucfirst( $type ) . 'Validate'; $value = self::$params_[ $key ]; $result = $class::execute( $value, $format ); if( $result === false ) { echo "ERROR $type \n"; return false; } } } return true; } }
clientプログラム
必要なvalidateの定義を行ない、validateManagerクラスに渡す。validateの定義を配列で行っているが設定ファイルから呼び出す方針に変更も可能。
<?php //client $form = array( 'aaaa' => array( 'String' => TRUE, 'Length' => 15, 'Regex' => '/\w.*/i' ) ); // 実行 $stat = ValidateManager::execute( $form ); if( $stat ) { echo "TRUE \n"; } else { echo "FALSE \n"; }