Laravel - 表单
Laravel - 现代表单处理
Section titled “Laravel - 现代表单处理”Laravel 通过与 Blade 模板引擎的无缝集成,极大地简化了 HTML 表单的处理。现代 Laravel 开发鼓励使用标准 HTML 表单,并辅以 Blade 指令来增强,例如 CSRF 保护、使用旧输入重新填充表单字段以及显示验证错误。这种方法提供了灵活性,并利用了 Laravel 的内置功能。
创建基本表单
Section titled “创建基本表单”你将首先为表单编写标准的 HTML 代码。通常,表单使用 POST 方法将数据提交到特定的路由来处理提交。
CSRF 保护
Section titled “CSRF 保护”跨站请求伪造 (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。
显示验证错误
Section titled “显示验证错误”当验证失败时,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 变量包含该字段的错误消息。
完整示例:联系表单
Section titled “完整示例:联系表单”让我们创建一个简单的联系表单,用于收集用户的姓名、电子邮件和消息。
步骤 1:创建视图
Section titled “步骤 1:创建视图”创建一个 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>步骤 2:创建控制器
Section titled “步骤 2:创建控制器”使用 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 方法会自动将用户重定向回表单,同时附带错误消息。
步骤 3:定义路由
Section titled “步骤 3:定义路由”将以下路由添加到你的 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');步骤 4:测试表单
Section titled “步骤 4:测试表单”在浏览器中访问 /contact。你应该看到联系表单。
尝试不填写所有字段就提交表单,查看验证错误。
如果正确填写,你应该会重定向回表单并看到成功消息。
Laravel 中这种现代的表单处理方法功能强大、安全,并且与标准 Web 开发实践很好地契合。