2019-09-06 23:53:10 +08:00

175 lines
3.8 KiB
PHP
Executable File

<?php
class LtValidator
{
public $configHandle;
protected $errorMessages;
public function __construct()
{
if (! $this->configHandle instanceof LtConfig)
{
if (class_exists("LtObjectUtil", false))
{
$this->configHandle = LtObjectUtil::singleton("LtConfig");
}
else
{
$this->configHandle = new LtConfig;
}
}
}
public function init()
{
$this->errorMessages = $this->configHandle->get('validator.error_messages');
}
/**
* Validate an element
*
* @param mixed $value
* @param array $dtd
* @return array
*/
public function validate($value, $dtd)
{
$errorMessages = array();
$label = $dtd->label;
if (is_array($dtd->rules) && count($dtd->rules))
{
$messages = isset($dtd->messages) ? $dtd->messages : array();
foreach ($dtd->rules as $key => $val)
{
// callback_user_function
if ('callback_' == substr($key, 0, 9))
{
$method = substr($key, 9);
// 定义了过程函数
if (function_exists($method))
{
if (!$method($value, $dtd->rules[$key]))
{
if (isset($this->errorMessages[$key]))
{
$messages[$key] = $this->errorMessages[$key];
}
else
{
$messages[$key] = "validator.error_messages[$key] empty";
}
$errorMessages[$key] = sprintf($messages[$key], $label, $dtd->rules[$key]);
}
continue;
}
// 定义了类方法
$rc = new ReflectionClass($val);
if ($rc->hasMethod($method))
{
$rcMethod = $rc->getMethod($method);
if ($rcMethod->isStatic())
{
$ret = $rcMethod->invoke(null, $value, $dtd->rules[$key]);
}
else
{
// 非静态方法需要一个实例 有待考虑单例
$rcInstance = $rc->newInstance();
$ret = $rcMethod->invoke($rcInstance, $value, $dtd->rules[$key]);
}
if (!$ret)
{
if (isset($this->errorMessages[$key]))
{
$messages[$key] = $this->errorMessages[$key];
}
else
{
$messages[$key] = "validator.error_messages[$key] empty";
}
$errorMessages[$key] = sprintf($messages[$key], $label, $dtd->rules[$key]);
}
continue;
}
continue;
}
// end callback_user_function
$validateFunction = '_' . $key;
if ((is_bool($dtd->rules[$key]) || 0 < strlen($dtd->rules[$key])) && !$this->$validateFunction($value, $dtd->rules[$key]))
{
if (empty($messages[$key]))
{
if (isset($this->errorMessages[$key]))
{
$messages[$key] = $this->errorMessages[$key];
}
else
{
$messages[$key] = "validator.error_messages[$key] empty";
}
}
$errorMessages[$key] = sprintf($messages[$key], $label, $dtd->rules[$key]);
}
}
}
return $errorMessages;
}
protected function _ban($value, $ruleValue)
{
return !preg_match($ruleValue, $value);
}
protected function _mask($value, $ruleValue)
{
return preg_match($ruleValue, $value);
}
protected function _equal_to($value, $ruleValue)
{
return $value === $ruleValue;
}
protected function _max_length($value, $ruleValue)
{
return mb_strlen($value) <= $ruleValue;
}
protected function _min_length($value, $ruleValue)
{
return mb_strlen($value) >= $ruleValue;
}
protected function _max_value($value, $ruleValue)
{
return $value <= $ruleValue;
}
protected function _min_value($value, $ruleValue)
{
return $value >= $ruleValue;
}
protected function _min_selected($value, $ruleValue)
{
return count($value) >= $ruleValue;
}
protected function _max_selected($value, $ruleValue)
{
return count($value) <= $ruleValue;
}
protected function _required($value, $ruleValue)
{
if (false == $ruleValue)
{
return true;
}
else
{
return is_array($value) && count($value) || strlen($value);
}
}
}