分类
PHP应用

Laravel 5.5添加自定义表单验证规则

存在验证码身份证的函数:

if (!function_exists('is_card')) {
     /
      * 身份证号
      * @param $str
      * @return bool
      */
     function is_card($str)
     {
         $str = strtoupper($str);
         $regx = "/(^d{15}$)|(^d{17}([0-9]|X)$)/";
         $arr_split = array();
         if (!preg_match($regx, $str)) {
             return false;
         }
         //检查15位
         if (15 == strlen($str)) {
             $regx = "/^(d{6})+(d{2})+(d{2})+(d{2})+(d{3})$/";
             @preg_match($regx, $str, $arr_split);
             //检查生日日期是否正确
             $dtm_birth = "19" . $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
             if (!strtotime($dtm_birth)) {
                 return false;
             } else {
                 return true;
             }
         } else {
             //检查18位
             $regx = "/^(d{6})+(d{4})+(d{2})+(d{2})+(d{3})([0-9]|X)$/";
             @preg_match($regx, $str, $arr_split);
             $dtm_birth = $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
             //检查生日日期是否正确
             if (!strtotime($dtm_birth)) {
                 return false;
             } else {
                 //检验18位身份证的校验码是否正确。
                 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
                 $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                 $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                 $sign = 0;
                 for ($i = 0; $i < 17; $i++) {
                     $b = (int)$str{$i};
                     $w = $arr_int[$i];
                     $sign += $b * $w;
                 }
                 $n = $sign % 11;
                 $str_num = $arr_ch[$n];
                 if ($str_num != substr($str, 17, 1)) {
                     return false;
                 } else {
                     return true;
                 }
             }
         }
     }
 }

以上函数添加到laravel的验证器中,实现方法:

1、服务提供者 AppServiceProvider@boot方法下添加代码:

use Validator;
public function boot()
{
   //Schema::defaultStringLength(191);
   //自定义验证码规则 Validator::_extend_('is_card', function ($attribute, $value, $parameters) {
      return is_card($value);
   });
}

2、cn/validation.php 验证规则中文包最后添加一条:

'is_card' => ':attribute 格式不正确。',

3、使用

$validator = Validator::make($request->all(), [
     'name' => 'required',
     'phone' => 'required|regex:/^1[23456789]d{9}$/i',
     'card' => 'required|is_card',
 ]);

注意:is_card命名必须是is_card,不能使用isCard这种命名