方便和强大的Laravel数据验证

方便和强大的Laravel数据验证

现在比以往任何时候都更重要的是,你的应用程序中的数据是有效的、准确的,并符合所有的系统要求。它解决了保持数据一致性和避免安全漏洞的需要。

Laravel让数据验证变得简单而直观。它遵循一个模型视图控制器(MVC)架构,只需要PHP和面向对象编程(OOP)概念的一般知识。此外, Laravel提供了几种方法来验证传入的数据。

探索这些方法中的一些,以及如何将验证规则应用于你的数据集。

  1. 在Laravel中轻松实现数据验证
  2. 验证的基础知识
  3. 高级验证
  4. 自定义验证

在Laravel中轻松实现数据验证

Laravel提供了几个现成的验证规则,当你的应用程序的用户通过表单提交数据。你可以将输入字段标记为必填,设置一个最小或最大的长度,并要求唯一(非重复)的条目和有效的电子邮件地址。Laravel验证器会检查输入是否满足这些规则或你指定的任何其他规则。

这些Laravel的验证规则包括:

  •  required — 字段数据不能为空或空。
  •  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 方法,在存储前验证进入存储端点的数据。

这个例子将使用这些规则来验证以下字段:

  • email — 应该是唯一的,有效的电子邮件,而且必须是必填的
  • password — 应该有一个最小的长度,密码确认,并且必须是必填的
  • age — 必须是一个数字,必须是必填的
<?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 的字段,其数据必须与password字段相匹配。

显示错误信息

如果验证标准得到满足,你的代码将继续正常运行。如果验证失败,会抛出一个 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();

你也可以通过向 Validate::make method 传递名为 messages 的第三个参数来定制你的错误信息:

$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提供了许多灵活的方法来确保通过你的应用程序的数据的完整性和准确性。你可以用默认的和可定制的方法来实现复杂的验证逻辑, 使你的代码库结构良好,更容易重用。

评论留言