PHP Validation実装メモ

単純なバリデーション機能を実装するためのメモ

``` php:validate.php
############################################################
/**
 * error messages
 */
############################################################
public $validateMessage = array(
	'required'     => '入力必須です',
	'alphaNumeric' => '半角英数字で入力してください',
	'email'        => 'メールアドレスが不正です',
	'tel'          => '電話番号形式で入力してください',
	'zip'          => '郵便番号形式で入力してください',
	'confirm'      => '入力内容が一致しません',
	//'date'         => '日付形式で入力してください',
	//'decimal'      => '小数点第%s位までの半角数字を入力してください。',
	//'numeric'      => '半角数字で入力してください',
	//'url'          => 'URL形式で入力してください',
	//'isUnique'     => 'この値は既に登録済です',
	//'inList'       => '入力値が正しくありません',
	//'maxLen'       => '入力された文字数が制限を越えています(最大%s文字)',
	//'minLen'       => '入力された文字数が制限未満です(最小%s文字)',
	);

function run($validateRules, $datas) {
	$errorMessage = array();
	foreach ($validateRules as $this->key => $rules) {
		foreach ($rules as $rule) {
			if (isset($errorMessage[$this->key])) continue;

			$rule = $this->_extractOptionFromRule($rule);

			$funcName = '_valid_' . $rule;
			$this->data = (isset($datas[$this->key])) ? $datas[$this->key] : '';

			if (method_exists($this, $funcName)) {
				$result = $this->$funcName();
			}
			/* 独自のバリデーション
			elseif (method_exists($Model, $rule)) {
				$result = $Model->$rule($datas);
			}
			*/
			else continue;

			if (!$result) {
				$errorMessage[$this->key] = $this->_setErrorMessage($rule);
			}
		}
	}
	return $errorMessage;
}

# ex. 
# @param  'confirm[confirm_password]'
# @return 'confirm'
# $this->option には Array ( confirm_password )がセットされる
private function _extractOptionFromRule($rule) {
	$this->options = array();
	$pos = strpos($rule, '[');
	if ($pos) {
		$this->options = explode(',', substr($rule, $pos + 1, -1));
		$rule = substr($rule, 0, $pos);
	}
	return $rule;
}

private function _setErrorMessage($rule) {
	if (isset($this->validateMessage[$rule])) {
		$message = $this->validateMessage[$rule];
	}
	else {
		$message = "valid error!";
	}
	return $message;
}


############################################################
/**
 * validation method
 */
############################################################
private function _valid_required() {
	return (!empty($this->data)) ? true : false;
}

private function _valid_alphaNumeric() {
	return (preg_match("/^[a-zA-Z0-9]+$/", $this->data)) ? true : false;
}

private function _valid_email() {
	return (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $this->data)) ? true : false;
}

private function _valid_zip() {
	return (preg_match("/^[0-9]{3}-[0-9]{4}$/", $this->data)) ? true : false;
}

private function _valid_tel() {
	return (preg_match("/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$/", $this->data)) ? true : false;
}

private function _valid_confirm() {
	$confirmData = (isset($this->datas[$this->options[0]])) ? $this->datas[$this->options[0]] : '';
	return ($this->data === $confirmData) ? true : false;
}

# ex yyyy-mm-dd
private function _valid_date($this->data) {
	return (preg_match('/^([1-9][0-9]{3})-(0[1-9]{1}|1[0-2]{1})-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})$/', $this->data)) ? true : false;
}
	
```

###Use cases
```php:hogehoge.php
$validateRules = array(
	'addUser' => array(
		'name' => array('required'),
		'tel'  => array('required', 'tel'),
		'zip'  => array('zip'),
			),
	'updatePass' => array(
		'login_name'       => array('required'),
		'password'         => array('required'),
		'confirm_password' => array('required', 'confirm[password]'),
			)
	);

function addUser() {
	$datas = array(
		'name' => 'userA',
		'zip'  => '123-1234',
	);
	$errorMessage = $this->validate->run($this->validateRules['addUser'], $datas);
	
	print_r($errorMessage);
	// Array ( [tel] => 入力必須です )
}

function updatePass() {
	$datas = array(
		'login_name'       => 'userA',
		'password'         => 'boss',
		'confirm_password' => 'pass',
	);
	$errorMessage = $this->validate->run($this->validateRules['updatePass'], $datas);
	
	print_r($errorMessage);
	// Array ( [confirm_password] => 入力内容が一致しません )
}

```