一、简介
-
表单验证是为了防止访问者跳过客户端验证而造成的系统安全问题,一但非法用户绕过客户端验证而服务器端没有加以验证,这样就是很不安全了,所以项目必须要进行服务器端表单验证。 -
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验证字段值的大小是否介于指定的 min和max之间,字符串数值或是文件大小的计算方式和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 效果:
三、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文件夹,它会存放所有验证器,现在里面就包含了刚才新建的自定义Request类UserRequest -
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 即可实现效验 } }
五、将自带的 英文错误 切换为 中文错误
- 在上面都是自定义验证错误,如果不通过自定义错误,而是将系统配置默认的英文错误切换成中文,这样会更方便简单,可以参考 PHP - Laravel 表单验证错误切换为中文