Laravel - 验证
Laravel - 输入验证
Section titled “Laravel - 输入验证”验证 (Validation) 是应用开发中至关重要的一环,它确保传入的数据在处理之前符合特定的标准。Laravel 提供了多种便捷的方式来验证传入的 HTTP 请求数据,并提供了各种强大的验证规则 (validation rules)。默认情况下,Laravel 的基础控制器类使用 ValidatesRequests trait,该 trait 提供了一个方便的 validate 方法。
可用的验证规则
Section titled “可用的验证规则”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 验证文档。
显示验证错误
Section titled “显示验证错误”当验证失败时,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基础验证示例
Section titled “基础验证示例”步骤 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 文档中探索自定义验证规则、条件验证和错误消息本地化。