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

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

一、简介

  • 表单验证 是为了防止访问者跳过客户端验证而造成的系统安全问题,一但非法用户绕过客户端验证而服务器端没有加以验证,这样就是很不安全了,所以项目必须要 进行服务器端表单验证
  • Laravel 提供了多种不同的验证方法来对应用程序传入的数据进行验证。
  • 常用 验证规则
规则名 说明
required 不能为空。
max:value 字段值必须小于或等于 value,对于字符串来说,value 为字符数。
min:value 字段值必须大于或等于 value,对于字符串来说,value 为字符数。
email 验证邮箱是否合法。
url 验证字段必须是有效的 URL 格式。
confirmed 验证两个字段是否相同,如果验证的字段是 password,则必须输入一个与之匹配的 passward_confirmation 字段。
integer 验证字段必须是整型。
ip 验证字段必须是 IP 地址。
numeric 验证字段必须是数值。
size:value value 验证字段必须有和给定值 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 效果:


三、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
  • 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 即可实现效验
    }
}

五、将自带的 英文错误 切换为 中文错误

相关文章
|
8月前
|
中间件 PHP 调度
深入浅出PHP框架之Laravel的优雅
【10月更文挑战第3天】在PHP的世界里,Laravel以其优雅和简洁闻名。本文将带你走进Laravel的世界,探索它的魔法。我们将通过代码示例,一步步揭示Laravel的魅力。准备好,让我们一起开始这场奇妙的旅程吧!
|
3月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
187 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
9月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
7月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
224 4
|
7月前
|
缓存 安全 PHP
深入浅出PHP框架之Laravel的优雅与实用
【10月更文挑战第22天】在PHP的世界里,Laravel如同一股清流,以其优雅的设计和实用的功能赢得了广大开发者的喜爱。本文将带你走进Laravel的世界,探索其背后的设计哲学,以及如何利用Laravel构建高效、可维护的Web应用。从路由到模型,从控制器到视图,我们将一步步揭开Laravel的神秘面纱。
146 3
|
8月前
|
存储 前端开发 PHP
深入浅出PHP框架之Laravel的优雅
【9月更文挑战第31天】在编程世界里,PHP语言如同一位多才多艺的老匠人,而Laravel框架则是其手中的精工细作。本文将带你领略Laravel的魅力所在,从其优雅的设计哲学到实用的功能特性,再到如何通过实际代码示例掌握它的核心操作。让我们一起探索Laravel的世界,发现编程之美。
126 6
|
7月前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
10月前
|
安全 前端开发 PHP
构建与验证表单:传统PHP与Laravel框架的比较分析——探索Web开发中表单处理的优化策略和最佳实践
【8月更文挑战第31天】在 Web 开发中,表单构建与数据验证至关重要。传统 PHP 方法需手动处理 HTML 表单和数据验证,而 Laravel 框架则提供了一种更现代、高效的解决方案。本文通过对比传统 PHP 和 Laravel 的方法,探讨表单构建与验证的最佳实践。Laravel 通过简洁的语法糖、内置的数据过滤和验证机制,显著提升了代码的安全性和可维护性,适用于大型项目或需要快速开发的场景。然而,在追求灵活性的小型项目中,直接使用 PHP 仍是不错的选择。了解两者的优劣,有助于开发者根据项目需求做出最佳决策。
88 0
|
10月前
|
前端开发 中间件 PHP
|
10月前
|
缓存 中间件 PHP
Laravel 框架:优雅 PHP Web 开发的典范
【8月更文挑战第31天】
340 0