PHP - Laravel 表单验证(验证规则与使用 $this->validate()、Validator::make()、Requests)

本文详细介绍了Laravel框架中的表单验证机制,包括内置验证规则、$this->validate()函数案例、Validator::make()独立验证、Requests验证器的应用,以及如何切换默认英文错误为中文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介
  • 表单验证 是为了防止访问者跳过客户端验证而造成的系统安全问题,一但非法用户绕过客户端验证而服务器端没有加以验证,这样就是很不安全了,所以项目必须要 进行服务器端表单验证

  • Laravel 提供了多种不同的验证方法来对应用程序传入的数据进行验证。

  • 常用 验证规则

    规则名说明
    required不能为空。
    max:value字段值必须小于或等于 value,对于字符串来说,value 为字符数。
    min:value字段值必须大于或等于 value,对于字符串来说,value 为字符数。
    email验证邮箱是否合法。
    url验证字段必须是有效的 URL 格式。
    confirmed验证两个字段是否相同,如果验证的字段是 password,则必须输入一个与之匹配的 passward_confirmation 字段。
    integer验证字段必须是整型。
    ip验证字段必须是 IP 地址。
    numeric验证字段必须是数值。
    size:valuevalue 验证字段必须有和给定值 value 想匹配的尺寸;对字符串而言,value 是相应的字符数目;对数值而言,value 是给定整型值;对文件而言,value 是相应的文件字节数。
    string验证字段必须是字符串。
    unique表名,字段,需要排除的 ID
    between:min,max验证字段值的大小是否介于指定的 minmax 之间,字符串数值或是文件大小的计算方式和 size 规则相同。
    更多验证规则Laravel 所有可用的验证规则及其功能
二、$this->validate() (案例:Form 表单添加用户)
  • web.php: 用户操作都放在 UserController 文件中

    // 添加用户页面
    Route::get('adduser', 'UserController@index') -> name('user.adduser');
    // 添加用户处理
    Route::post('adduser', 'UserController@save') -> name('user.adduser');
    
  • user/index.blade.php: 显示添加用户页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>新增用户</title>
    </head>
    <body>
      {{-- 如果有错误,就提示出来,模板中输出错误信息 --}}
      @if($errors->any())
        <ul>
          @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
          @endforeach
        </ul>
      @endif
      {{-- 提交到指定路由,通过别名获取到路由地址 --}}
      <form action="{{ route('user.adduser') }}" method="post">
        @csrf
        {{-- 使用 old('account') 当页面重置的时候该字段会用上次提交的旧值继续展示,不会清空 --}}
        <div>用户账号:<input type="text" name="account" value="{{ old('account') }}"></div>
        <div>用户密码:<input type="password" name="pwd"></div>
        <div>确认密码:<input type="password" name="pwd_confirmation"></div>
        <div>用户邮箱:<input type="email" name="email" value="{{ old('email') }}"></div>
        <input style="margin-top: 5px;" type="submit" value="添加用户">
      </form>
    </body>
    </html>
    
  • UserController.php: 用户控制器页面

    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    class UserController extends Controller
    {   
        // 显示添加用户页面
        public function index() {
            return view('user.index');
        }
    
        // 处理添加用户操作
        public function save(Request $request) {
            // 输出请求数据
            dump($request->all());
            // aravel 5.6 之前是不会自动移除 _token 验证字段的,需要手动移除
            dump($request->except(['_token']));
    
            // 表单数据后台验证
            // laravel 5.6 之后会返回一个 $input,$input 会将验证字段 _token 移除掉
            $input = $this->validate($request, [
                // 字段名 => 规则名(多规则用 | 隔开)
                'account' => 'required|between:2,6',
                // 确认密码的 confirmed 属性一定要写在原始密码上
                'pwd' => 'required|confirmed',
                'pwd_confirmation' => 'required',
                'email' => 'required|email'
            ], [
                // 字段名.规则名 => 错误语句
                'account.required' => '用户名不能为空',
                'account.between' => '用户名必须为2-6个字符',
                'pwd.required' => '密码不能为空',
                'pwd.confirmed' => '两次密码不一致',
                'email.required' => '邮箱不能为空',
                'email.email' => '邮箱格式不正确',
            ]);
            // 输出请求数据
            dump($input);
        }
    }
    
  • Demo 效果:

    image.png

    image.png

三、Validator::make() (独立验证)
  • 还是 上面的案例代码,现在需要通过 独立验证 方式来验证。

  • UserController.php: 用户控制器页面

    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    
    // 独立验证,导入 Validator
    // use Illuminate\Support\Facades\Validator;
    // 可以直接简写为下面这种方式
    // 为什么能这么简写?因为在 /config/app.php 文件中有配置改路径
    use Validator;
    
    class UserController extends Controller
    {   
        // 显示添加用户页面
        public function index() {
            return view('user.index');
        }
    
        // 处理添加用户操作
        public function save(Request $request) {
            // 输出请求数据
            // dump($request->all());
            // aravel 5.6 之前是不会自动移除 _token 验证字段的,需要手动移除
            // dump($request->except(['_token']));
    
            // 表单数据后台验证
            $validate = Validator::make($request->all(), [
                // 字段名 => 规则名(多规则用 | 隔开)
                'account' => 'required|between:2,6',
                // 确认密码的 confirmed 属性一定要写在原始密码上
                'pwd' => 'required|confirmed',
                'pwd_confirmation' => 'required',
                'email' => 'required|email'
            ], [
                // 字段名.规则名 => 错误语句
                'account.required' => '用户名不能为空',
                'account.between' => '用户名必须为2-6个字符',
                'pwd.required' => '密码不能为空',
                'pwd_confirmation.required' => '确认密码不能为空',
                'pwd.confirmed' => '两次密码不一致',
                'email.required' => '邮箱不能为空',
                'email.email' => '邮箱格式不正确',
            ]);
            // 输出验证对象所有可用方法
            // dump(get_class_methods($validate));
            // 输出验证对象
            // dump($validate);
            // 判断是否验证失败
            if ($validate->fails()) {
                // 返回错误结果
                return redirect()->back()->withErrors($validate);
            }
            // 输出请求数据
            dump($request->all());
        }
    }
    
四、Requests (验证器)
  • 还是 上面的案例代码,之前是在当前方法内进行验证,现在需要通过 验证器 来验证

  • 创建 验证器(自定义 Request 类)

    $ php artisan make:request UserRequest
    

    Http 文件夹中会多出来一个 Requests 文件夹,它会存放所有验证器,现在里面就包含了刚才新建的自定义 RequestUserRequest

    image.png

  • UserRequest.php: 将效验规则写入到 UserRequest

    <?php
    namespace App\Http\Requests;
    use Illuminate\Foundation\Http\FormRequest;
    class UserRequest extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {   
            // 是否使用权限验证,false 使用,true 不使用,默认 fase
            // return false;
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                // 字段名 => 规则名(多规则用 | 隔开)
                'account' => 'required|between:2,6',
                // 确认密码的 confirmed 属性一定要写在原始密码上
                'pwd' => 'required|confirmed',
                'pwd_confirmation' => 'required',
                'email' => 'required|email'
            ];
        }
    
        // 错误提示
        public function messages()
        {
            return [
                // 字段名.规则名 => 错误语句
                'account.required' => '用户名不能为空',
                'account.between' => '用户名必须为2-6个字符',
                'pwd.required' => '密码不能为空',
                'pwd_confirmation.required' => '确认密码不能为空',
                'pwd.confirmed' => '两次密码不一致',
                'email.required' => '邮箱不能为空',
                'email.email' => '邮箱格式不正确',
            ];
        }
    
    }
    
  • UserController.php: 用户控制器页面使用 UserRequest

    <?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    
    // 导入自定义的 Request 类
    use App\Http\Requests\UserRequest;
    
    class UserController extends Controller
    {   
        // 显示添加用户页面
        public function index() {
            return view('user.index');
        }
    
        // 处理添加用户操作
        public function save(UserRequest $request) {
            // 输出请求数据
            dump($request->all());
            // aravel 5.6 之前是不会自动移除 _token 验证字段的,需要手动移除
            // dump($request->except(['_token']));
    
            // 表单数据后台验证
            // 这里将不用在写验证,将上面的 Request 换成 UserRequest 即可实现效验
        }
    }
    
五、将自带的 英文错误 切换为 中文错误
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值