Skip to content

Laravel - 验证

验证 (Validation) 是应用开发中至关重要的一环,它确保传入的数据在处理之前符合特定的标准。Laravel 提供了多种便捷的方式来验证传入的 HTTP 请求数据,并提供了各种强大的验证规则 (validation rules)。默认情况下,Laravel 的基础控制器类使用 ValidatesRequests trait,该 trait 提供了一个方便的 validate 方法。

Laravel 提供了全面的验证规则列表。以下是一些常用的规则(此列表不完整):

常用的验证规则
accepted
alpha
array
boolean
date_format:format
digits_between:min,max
file (also image, mimes, mimetypes)
ip (also ipv4, ipv6)
min:value
numeric
required
required_with:foo,bar,...
required_without_all:foo,bar,...
string
url

有关完整列表和详细用法,请始终查阅官方 Laravel 验证文档。

当验证失败时,Laravel 会自动将用户重定向回他们之前的位置(或对于 AJAX 请求,重定向到指定的 URI)。验证错误会自动闪存 (flash) 到 Session 中,从而可以通过 $errors 变量在你的 Blade 视图中访问它们。$errors 变量是 Illuminate\Support\MessageBag 的一个实例。

你可以在列表中显示所有错误:

@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif

或者使用 @error 指令显示特定字段的错误:

<label for="username">Username</label>
<input type="text" name="username" id="username" class="@error('username') is-invalid @enderror">
@error('username')
<div class="alert alert-danger">{{ $message }}</div>
@enderror

步骤 1: 创建一个名为 AuthValidationController 的控制器。

php artisan make:controller AuthValidationController

步骤 2: 执行成功后,打开 app/Http/Controllers/AuthValidationController.php 并添加以下方法:

app/Http/Controllers/AuthValidationController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AuthValidationController extends Controller
{
public function showLoginForm()
{
return view('auth.login_form'); // 我们将在下一步创建此视图
}
public function processLogin(Request $request)
{
$validatedData = $request->validate([
'username' => 'required|string|max:20|alpha_num',
'password' => 'required|string|min:8',
'email' => 'nullable|email' // 可选的电子邮件字段
]);
// 如果验证通过, $validatedData 将包含已验证的数据。
// 在这里,你可以继续进行认证或其他逻辑。
// 对于本例,我们只返回一个成功消息。
return 'Login form submitted successfully with valid data!';
}
}

步骤 3: 在 resources/views/auth/login_form.blade.php 创建一个 Blade 视图文件并添加以下 HTML 表单:

resources/views/auth/login_form.blade.php

<!DOCTYPE html>
<html>
<head>
<title>Login Form</title>
<style>
.alert-danger { color: red; list-style: none; padding-left: 0; }
.is-invalid { border-color: red; }
label, input, button { display: block; margin-bottom: 10px; }
</style>
</head>
<body>
<h1>Login</h1>
@if ($errors->any())
<div class="alert alert-danger">
**Whoops! Something went wrong.**
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="{{ url('/validate-login') }}">
@csrf <!-- CSRF Token -->
<div>
<label for="username">Username:</label>
<input type="text" name="username" id="username" value="{{ old('username') }}" class="@error('username') is-invalid @enderror">
@error('username')
<div class="alert-danger">{{ $message }}</div>
@enderror
</div>
<div>
<label for="password">Password:</label>
<input type="password" name="password" id="password" class="@error('password') is-invalid @enderror">
@error('password')
<div class="alert-danger">{{ $message }}</div>
@enderror
</div>
<div>
<label for="email">Email (Optional):</label>
<input type="email" name="email" id="email" value="{{ old('email') }}" class="@error('email') is-invalid @enderror">
@error('email')
<div class="alert-danger">{{ $message }}</div>
@enderror
</div>
<div>
<button type="submit">Login</button>
</div>
</form>
</body>
</html>

注意: old('username') 函数用于在验证失败时,用先前的输入值重新填充表单字段。

步骤 4: 在 routes/web.php 文件中为这些操作添加路由:

routes/web.php

use App\Http\Controllers\AuthValidationController;
Route::get('/login-form', [AuthValidationController::class, 'showLoginForm']);
Route::post('/validate-login', [AuthValidationController::class, 'processLogin']);

步骤 5: 在浏览器中访问 http://localhost:8000/login-form。

步骤 6: 尝试提交表单时不输入任何数据,或输入违反规则的数据(例如,密码少于 8 个字符)。你将被重定向回表单,并显示验证错误消息。

用于复杂验证的表单请求 (Form Requests)

Section titled “用于复杂验证的表单请求 (Form Requests)”

对于更复杂的场景,你可以创建 Form Request 类。这些类允许你封装验证逻辑和授权检查。使用 php artisan make:request StorePostRequest 生成一个表单请求。然后你可以在控制器方法中对这个请求进行类型提示 (type-hint),Laravel 会在你的控制器方法甚至被调用之前自动验证传入的数据。

进一步学习: 在官方 Laravel 文档中探索自定义验证规则、条件验证和错误消息本地化。