Laravel 提供了许多有用的验证规则;同时也支持自定义规则。在服务容器中使用注册自定义验证规则:
Laravel 自定义规则实现手机号、身份证号、密码强度的验证
定义验证规则,在创建文件app\Providers\Traits\ValidatorTrait.php
<?php namespace App\Providers\Traits; use Illuminate\Support\Facades\Validator; trait ValidatorTrait { public function validatorBoot() { //扩展验证规则 //验证手机号 Validator::extend('phone', function ($attribute, $value, $parameters, $validator) { $pattern = '/^1[3456789]{1}\d{9}$/'; $res = preg_match($pattern, $value); return $res > 0; }); Validator::replacer('phone', function ($message, $attribute, $rule, $parameters) { return $message; //return str_replace($attribute,$rule,$message); }); //验证身份证号 Validator::extend('identityCard', function ($attribute, $value, $parameters, $validator) { return $this->checkIdentityCard($value); }); Validator::replacer('identityCard', function ($message, $attribute, $rule, $parameters) { return $message; //return str_replace($attribute,$rule,$message); }); //验证密码长度及强度.三个参数:最小长度,最大长度,密码强度1-4 Validator::extend('myPassword', function ($attribute, $value, $parameters, $validator) { return $this->checkPassword($value, $parameters); }); Validator::replacer('myPassword', function ($message, $attribute, $rule, $parameters) { return $message; }); } /** * 验证身份证 * @param $idCard * @return bool * @author code.cent123.com * @date 2020/5/1 */ public static function checkIdentityCard($idCard) { // 只能是18位 if (strlen($idCard) != 18) { return false; } // 取出本体码 $idcard_base = substr($idCard, 0, 17); // 取出校验码 $verify_code = substr($idCard, 17, 1); // 加权因子 $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 校验码对应值 $verify_code_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); // 根据前17位计算校验码 $total = 0; for ($i = 0; $i < 17; $i++) { $total += substr($idcard_base, $i, 1) * $factor[$i]; } // 取模 $mod = $total % 11; // 比较校验码 if ($verify_code == $verify_code_list[$mod]) { return true; } else { return false; } } /** * 验证密码 * @param $password * @param $parameters * @return bool * @author code.cent123.com * @date 2020/5/1 */ public static function checkPassword($password, $parameters) { $pwd_len = strlen($password); if ($pwd_len > $parameters[1] || $pwd_len < $parameters[0]) { return false; } //1) 是否包含小写字母 $pattern = '/[a-z]+/'; $res = preg_match($pattern, $password); //2) 是否包含大写字母 $pattern = '/[A-Z]+/'; $res2 = preg_match($pattern, $password); //3) 是否包含数字 $pattern = '/\d+/'; $res3 = preg_match($pattern, $password); //4) 是否包含特殊符号 $pattern = '/[\!\@\#\$\%\^\&\*\(\)\_\+\-\=\;\:\"\'\|\\\<\>\?\/\.\,\`\~]+/'; $res4 = preg_match($pattern, $password); $sum = $res + $res2 + $res3 + $res4; return $sum >= $parameters[2]; } }
2.在app\Providers\AppServiceProvider.php引入Trait
<?php namespace App\Providers; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Validator; class AppServiceProvider extends ServiceProvider { use \App\Providers\Traits\ValidatorTrait; /** * Register any application services. * * @return void */ public function register() { Schema::defaultStringLength(191); } /** * Bootstrap any application services. * * @return void */ public function boot() { //扩展验证规则 code.cent123.com $this->validatorBoot(); } }
3.语言文件resources\lang\zh-CN\validation.php 注意驼峰命名和下划线的转换
//自定义验证规则 code.cent123.com 'phone' => ':attribute 不符合规范', 'identity_card' => ':attribute 不符合要求', 'my_password' => ':attribute 不符合要求',
4.使用,可以和Laravel的验证规则一起
$rules = [ 'user_name' => 'required|bewteen:4,8', 'user_password' => 'required|myPassword:6,16,2', 'user_phone' => 'required|phone', 'user_identityCard' => 'identityCard', ];