Skip to content

Laravel - 表单

Laravel 通过与 Blade 模板引擎的无缝集成,极大地简化了 HTML 表单的处理。现代 Laravel 开发鼓励使用标准 HTML 表单,并辅以 Blade 指令来增强,例如 CSRF 保护、使用旧输入重新填充表单字段以及显示验证错误。这种方法提供了灵活性,并利用了 Laravel 的内置功能。

你将首先为表单编写标准的 HTML 代码。通常,表单使用 POST 方法将数据提交到特定的路由来处理提交。

跨站请求伪造 (CSRF) 是一种恶意攻击。Laravel 会为应用管理的每个活跃用户会话自动生成一个 CSRF“令牌”。此令牌用于验证执行请求的是认证用户本人。为了保护你的应用,你必须在 HTML 表单定义中包含 @csrf Blade 指令:

<form method="POST" action="/submit-profile">
@csrf
...
</form>

当表单提交验证失败时,Laravel 会自动将用户重定向回上一页。它还会将请求的所有输入闪存到 Session。你可以使用 old 助手函数轻松地获取这些闪存的输入。这对于重新填充表单字段非常有用,用户无需重新输入所有内容。

<input type="text" name="username" value="{{ old('username') }}">

如果 old('username') 不存在(例如,首次访问表单时),它将返回 null。

当验证失败时,Laravel 还会将验证错误闪存到 Session。这些错误在你的 Blade 视图中通过 $errors 变量可用,它是 Illuminate\Support\MessageBag 的一个实例。你可以使用 @error Blade 指令快速检查给定属性是否存在验证错误消息并显示它们。

<label for="email">Email Address</label>
<input id="email" type="email" name="email" value="{{ old('email') }}">
@error('email')
<div class="alert alert-danger">{{ $message }}</div>
@enderror

@error 指令中的 $message 变量包含该字段的错误消息。

让我们创建一个简单的联系表单,用于收集用户的姓名、电子邮件和消息。

创建一个 Blade 视图文件 resources/views/contact.blade.php:

resources/views/contact.blade.php

<!DOCTYPE html>
<html>
<head>
<title>Contact Us</title>
<style>
.alert-danger { color: red; margin-top: 5px; }
.alert-success { color: green; margin-top: 10px; }
label { display: block; margin-top: 10px; }
input[type='text'], input[type='email'], textarea { width: 100%; padding: 8px; margin-top: 5px; box-sizing: border-box; }
button { margin-top: 15px; padding: 10px 15px; }
</style>
</head>
<body>
<h1>Contact Us</h1>
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<form method="POST" action="{{ route('contact.submit') }}">
@csrf
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="name" value="{{ old('name') }}" required>
@error('name')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</div>
<div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="{{ old('email') }}" required>
@error('email')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</div>
<div>
<label for="message">Message:</label>
<textarea id="message" name="message" rows="5" required>{{ old('message') }}</textarea>
@error('message')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</div>
<div>
<button type="submit">Send Message</button>
</div>
</form>
</body>
</html>

使用 Artisan 生成控制器:

php artisan make:controller ContactFormController

然后,在 app/Http/Controllers/ContactFormController.php 中添加显示表单和处理提交的方法:

app/Http/Controllers/ContactFormController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ContactFormController extends Controller
{
// 显示联系表单
public function create()
{
return view('contact');
}
// 处理表单提交
public function store(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|max:255',
'message' => 'required|string|min:10',
]);
// 处理数据(例如,发送电子邮件,保存到数据库)
// 在本例中,我们只重定向回并附带成功消息。
// Mail::to('admin@example.com')->send(new ContactMail($validatedData));
return redirect()->route('contact.form')
->with('success', 'Your message has been sent successfully!');
}
}

注意:如果验证失败,validate 方法会自动将用户重定向回表单,同时附带错误消息。

将以下路由添加到你的 routes/web.php 文件中:

routes/web.php

use App\Http\Controllers\ContactFormController;
Route::get('/contact', [ContactFormController::class, 'create'])->name('contact.form');
Route::post('/contact', [ContactFormController::class, 'store'])->name('contact.submit');

在浏览器中访问 /contact。你应该看到联系表单。 尝试不填写所有字段就提交表单,查看验证错误。 如果正确填写,你应该会重定向回表单并看到成功消息。

Laravel 中这种现代的表单处理方法功能强大、安全,并且与标准 Web 开发实践很好地契合。