Laravel 中的数据验证:方便而强大
已发表: 2023-05-03现在比以往任何时候都更重要的是,应用程序中的数据有效、准确并满足所有系统要求。 它解决了维护数据一致性和避免安全漏洞的需要。
Laravel 使数据验证变得简单直观。 它遵循模型视图控制器 (MVC) 架构,只需要 PHP 和面向对象编程 (OOP) 概念的一般知识。 此外,Laravel 提供了几种验证传入数据的方法。
探索其中一些方法以及如何将验证规则应用于您的数据集。
Laravel 中的数据验证变得简单
当您的应用程序的用户通过表单提交数据时,Laravel 提供了几个现成的验证规则。 您可以根据需要标记输入字段,设置最小或最大长度,并要求唯一(非重复)条目和有效的电子邮件地址。 Laravel 验证器检查输入是否满足这些规则或您指定的任何其他规则。
这些 Laravel 验证规则包括:
-
required
— 字段数据不能为 null 或为空。 -
array
— 字段数据必须是 PHP 数组。 -
bail
— 验证规则在遇到第一次验证失败后停止执行。 -
email
- 字段数据必须是有效的电子邮件地址。 -
unique
— 字段数据在数据库表中不得重复。
所有验证方法都有利弊,但它们的多样性使您能够选择最适合您需求的方法。 根据您选择的方法,Laravel 验证可以通过多种方式进行,包括手动或自动错误消息。
最常见的方法是 code>validate,用于传入的 HTTP 请求。 此方法链接到请求数据,执行验证规则。 您可以用逗号分隔每个字段的规则,如下例所示。
use Illuminate\Http\Request; public function store (Request $request){ $validated = $request->validate([ 'email' => ['required, unique:users, email, bail'], 'name' => ['required'], ]); }
在这里, email
是必需的输入,这意味着它不能为空。 此外,它在users
数据库表中必须是唯一的,以确保相同的电子邮件地址不会被注册两次。 最后一条规则规定电子邮件地址也必须有效。 否则,验证过程停止。 名称字段是必需的,但没有其他规则。
如果任何 Laravel 验证规则失败,将自动生成响应。
验证基础
为了更好地理解验证方法,请考虑以下示例。 您将为端点定义一个路由,并创建一个控制器来验证和处理请求数据。
首先,创建一个简单的端点,允许用户存储他们的电子邮件和密码。
定义路线
Laravel 路由在 Web 应用程序的routes/web.php文件或 API 的routes/api.php文件中定义。 对于这个例子,使用api.php :
use App\Http\Controllers\UserController; Route::post('/store', [UserController::class]);
创建控制器
运行这个 Artisan 命令来创建控制器:
php artisan make:controller UserController
此命令在app/Http/Controllers目录中创建一个UserController.php文件。
现在,定义一个store
方法来在存储数据之前验证进入存储端点的数据。
此示例将使用这些规则验证以下字段:
- 电子邮件- 应该是唯一的,有效的电子邮件,并且必须是必需的
- 密码- 应该有最小长度,密码确认,并且必须是必需的
- 年龄- 必须是一个数字并且必须是必需的
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * Store new user details. * */ public function store(Request $request){ $validated = $request->validate([ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); // After user data is validated, logic to store the data } }
confirmed
规则允许您要求特定字段两次以验证数据是否准确,例如用户在注册期间重新输入密码。 此规则需要一个名为password_confirmation
字段,其数据必须与密码字段匹配。
显示错误信息
如果满足验证条件,您的代码将继续正常运行。 如果验证失败,则抛出IlluminateValidationValidationException
异常,并返回适当的错误响应。
该示例基于一个 API,它以 JSON 格式返回422 Unprocessable Entity
HTTP 响应。 对于 web 应用程序,它将重定向到以前的 URL 以显示错误消息,并将请求数据闪到会话中。
您可以在视图中使用$errors
变量来显示返回的错误:
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
您还可以选择仅查看第一个错误或循环查看所有错误。
// Fetch all errors $errors->all() // Fetch only the first error $errors->first()
重新填写表格
重新填充表单使用户无需重新输入信息,因此他们可以专注于修复错误。 在电子邮件地址失败的示例中,您可以通过调用name
字段的旧值来重新填充表单的其余部分。
$name = $request-> old('name') //Blade helper <input type="text" name="name" value="{{ old('name') }}">
如果之前没有输入,则此规则将返回null
。
高级验证
Laravel 提供了另一种编写验证的方法,称为表单请求。 表单请求是一个自定义请求类,它组织验证并整理您的控制器。
它们有自己的适用于大输入量的验证和授权逻辑,可用于定义验证规则和自定义错误消息。
要创建表单请求,请运行以下 Artisan 命令:
php artisan make:request StoreUserRequest
此命令在app/Http/Requests目录中创建一个StoreUserRequest.php文件,并包含两个默认方法:
-
rules
返回请求数据的验证规则。 -
authorize
返回一个布尔值来表示该用户是否有权执行请求的操作。
将前面的示例转换为使用表单请求。
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreUserRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { // Add logic to check if the user is authorized to submit this data. return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]; } }
要自定义这些规则的错误消息,您可以覆盖FormRequest
类中的 messages 方法。
/** * Get the error messages for the defined validation rules. * * @return array */ public function messages() { return [ 'email.required' => 'An email address is required', 'email.email' => 'The email address must be valid', 'password.confirmed'=>'Re-type your password as password_confirmation, passwords does not match' ]; }
注意:数据名称和验证规则在消息数据之前以句点(.)分隔。
自定义验证
要创建自定义验证,您可以使用Validator
facade 而不是validate
。 验证器实例包含两个参数:要验证的数据和一组验证规则。 这两个参数被传递给验证器外观上的::make
方法,生成一个新的验证器实例。
use Illuminate\Http\Request; public function store (Request $request){ $validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); if ($validator->fails()) { // Return errors or redirect back with errors return $validator->errors(); } // Retrieve the validated input... $validated = $validator->validated(); // Continue logic to store the data }
如果你想添加一个自动直接,你可以在一个预先存在的验证器实例上执行validate
方法。 如果验证失败,XHR 请求会生成一个 JSON 响应,其中包含422 Unprocessable Entity
作为状态代码,否则用户将被立即重定向。
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'password' => 'required|min:7|confirmed' ])->validate();
您还可以通过将名为messages
的第三个参数传递给Validate::make method
来自定义错误消息:
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ], $messages = [ 'required' => 'The :attribute field is required.', ]);
注意:: :attribute
替换为验证中的字段名称。
概括
执行数据验证对于保持数据集干净、正确和完整至关重要。 数据验证使您能够消除数据中可能损坏或以其他方式影响项目的错误。 在大规模处理大量数据时,验证变得越来越重要。
Laravel 支持多种灵活的方法来确保通过您的应用程序的数据的完整性和准确性。 您可以使用默认和可自定义的方法实现复杂的验证逻辑,使您的代码库结构良好且更易于重用。
使用 Kinsta 的应用程序托管服务更快地发布您的 Laravel 应用程序。