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

 Laravel  2020-05-03  admin  200  270

Laravel 提供了许多有用的验证规则;同时也支持自定义规则。在服务容器中使用注册自定义验证规则:

Laravel 自定义规则实现手机号、身份证号、密码强度的验证

  1. 定义验证规则,在创建文件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 centphp.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 centphp.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()
    {
        //扩展验证规则 centphp.com
        $this->validatorBoot();
    }

}

    3.语言文件resources\lang\zh-CN\validation.php 注意驼峰命名和下划线的转换

//自定义验证规则  centphp.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',
];


相关推荐


封装的Laravel验证类

封装的Laravel验证类namespaceApp\Validate; useIlluminate\Support\Facades\Validator; classBaseValidate { /** *验证规则 *@var */ protected$rules; /** *返回信息 *@var */ protected$message; /** *验

封装的统一的Laravel响应类,返回数据类

封装的统一的Laravel返回数据类 namespaceApp\Library; classResponse { constOK=0; constBAD_REQUEST=1000; constPARAM_ERROR=1001; constSQL_ERROR=4000; constFORBIDDEN=4003; constSERVER_ERROR=5000;

封装Laravel批量更新方法

Laravel没有封装批量更新的方法,有时需要批量更新数据/** *批量更新数据 *@paramstring$table表名,不带前缀 *@paramarray$multipleData待更新的数据二维数组 *@returnbool|int */ functionupdateBatch(string$table,array$multipleData=[]) { try{ if(e

Laravel 自定义登录验证的守护和提供者以及代码实现

Laravel 使得实现身份验证非常简单。 事实上,几乎所有的配置都是现成的。 身份验证配置文件位于 config/auth.php, 其中包含几个有良好文档记录的选项,用于调整身份验证服务的行为。在其核心,Laravel 的认证设施由「守卫」和「提供者」组成。守卫决定如何对每个请求的用户进行身份验证。比如,Laravel 带有一个 session 保护,它使用会话存储和 Cookies 来维护状