Validator.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Leo
  5. * Date: 2017/11/12
  6. * Time: 下午3:20
  7. */
  8. namespace common\helpers;
  9. use common\helpers\IDValidator\IDValidator;
  10. use yii\base\InvalidConfigException;
  11. use yii\base\Model;
  12. class Validator extends \yii\validators\Validator {
  13. /**
  14. * 扩展的检验规则(最好与Yii自带的校验器区分开,优先使用这里的规则)
  15. * @var array
  16. * 例如:
  17. * 'zh' => ['/^[\x{4e00}-\x{9fa5}]+$/u', '请输入中文'], // 这里传值是正则和消息提示
  18. * 'idCard' => 'idCardValidate', // 这里传值是类里面存在的方法名
  19. */
  20. public static $extensionRule = [
  21. 'chDate' => ["#^\d{4}([/-])([0][0-9]|[1][0-2])\\1([0-2][0-9]|[3][0-1])$#", '必须为日期格式'],
  22. 'chMonth' => ["#^\d{4}([/-])([0][0-9]|[1][0-2]|[0-9])$#", '必须为年月格式'],
  23. 'phone' => ["#^\d{3}-\d{8}|\d{4}-\d{7}|\d{4}-\d{8}$#", '必须为电话格式'],
  24. 'mobile' => ["|^0[7-9]\d{9}$|", '格式输入不正确'],
  25. 'alpha' => ["|^[a-zA-Z]+$|", '必须为英文字母格式'],
  26. 'zh' => ['/^[\x{4e00}-\x{9fa5}]+$/u', '必须为中文'],
  27. 'price' => ["/^[0-9]+([.]{1}[0-9]{1,2})?$/", ' must be in the amount format'], // 必须为金额格式
  28. 'fullPrice' => ["/^\-?[0-9]+([.]{1}[0-9]{1,2})?$/", ' must be in the amount format'], // 必须为金额格式
  29. 'simpleIdCard' => ["/^\d{6}(19|2\d)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)?$/", '必须为身份证号码格式'],
  30. 'userName' => ["|^[a-z0-9]+$|", '只允许小写英文数字'],
  31. 'realName' => ["/^([\x{4E00}-\x{FA29}]|[\x{E7C7}-\x{E7F3}]|[a-zA-Z0-9. ])*$/u", '不允许包含特殊字符'],
  32. 'idCard' => 'idCardValidate',
  33. 'yearMonth' => ["/^\d{4}([0][0-9]|[1][0-2]|[0-9])$/", '必须为年月格式'],
  34. ];
  35. /**
  36. * 校验方法
  37. * @var
  38. */
  39. public $validateMethod;
  40. /**
  41. * init
  42. * @throws InvalidConfigException
  43. */
  44. public function init()
  45. {
  46. parent::init();
  47. if(!array_key_exists($this->validateMethod, self::$extensionRule)){
  48. $this->validateMethod = '';
  49. //throw new InvalidConfigException('校验方法不存在,请查看是否传值正确');
  50. }
  51. }
  52. /**
  53. * 用类的方法去校验
  54. * @param $methodName
  55. * @param $value
  56. * @return mixed
  57. * @throws InvalidConfigException
  58. */
  59. public function validateByMethod($methodName, $value){
  60. if(method_exists($this, $methodName)){
  61. return $this->$methodName($value);
  62. } else {
  63. throw new InvalidConfigException('校验方法不存在');
  64. }
  65. }
  66. /**
  67. * 用正则的方式去校验
  68. * @param $pattern
  69. * @param $value
  70. * @return int
  71. */
  72. public function validateByRegular($pattern, $value){
  73. return preg_match($pattern, $value);
  74. }
  75. /**
  76. * 校验值(主要用于表单model类里面的规则校验)
  77. * @param mixed $value
  78. * @return array|null
  79. * @throws InvalidConfigException
  80. */
  81. protected function validateValue($value)
  82. {
  83. if(!$this->validateMethod){
  84. throw new InvalidConfigException('校验方法不存在,请查看是否传值正确');
  85. }
  86. $rule = self::$extensionRule[$this->validateMethod];
  87. $valid = false;
  88. if(is_array($rule)){
  89. $valid = $this->validateByRegular($rule[0], $value);
  90. if ($this->message === null) {
  91. $this->message = \Yii::t('yii', '{attribute}'.$rule[1]);
  92. }
  93. } elseif(is_string($rule)){
  94. $valid = $this->validateByMethod($rule, $value);
  95. } else {
  96. throw new InvalidConfigException('校验规则不存在');
  97. }
  98. return $valid ? null : [$this->message, []];
  99. }
  100. /**
  101. * 单独校验某个值用快速的类方法
  102. * @param $method
  103. * @param $value
  104. * @return bool
  105. */
  106. public static function validateQuickLy($method, $value){
  107. $validator = new self();
  108. $validator->validateMethod = $method;
  109. $valid = $validator->validateValue($value);
  110. unset($validator);
  111. return $valid ? false : true;
  112. }
  113. // 以下为特殊的规则校验方法(用简单的正则无法实现的)
  114. /**
  115. * @param $value
  116. */
  117. private function idCardValidate($value){
  118. $iDValidator = IDValidator::getInstance();
  119. if(!$iDValidator->isValid($value)){
  120. if ($this->message === null) {
  121. $this->message = \Yii::t('yii', '{attribute}'.'不是真实有效的身份证号码');
  122. }
  123. }
  124. }
  125. }