在 Laravel 中,表单与请求处理是 Web 应用开发中的常见任务。Laravel 提供了丰富的功能来处理表单数据的接收、验证以及存储。这篇文章将详细介绍如何在 Laravel 中处理表单和请求。
1. 创建表单
Laravel 提供了一个简单的方式来生成 HTML 表单,常用的表单元素包括文本框、单选框、复选框、提交按钮等。
1.1 生成表单
在 Laravel 中,通常可以直接在视图文件中手动编写表单 HTML。例如,创建一个简单的登录表单:
<form action="{{ route('login') }}" method="POST">
@csrf
<label for="email">Email:</label>
<input type="email" name="email" id="email" required>
<label for="password">Password:</label>
<input type="password" name="password" id="password" required>
<button type="submit">Login</button>
</form>
在这个例子中,@csrf 用来生成一个 CSRF(跨站请求伪造)令牌,确保表单提交是安全的。
1.2 使用 Laravel 表单辅助函数
Laravel 提供了一个 Form 类来生成常用的表单组件。如果你启用了 Laravel Collective 扩展包,可以使用这个更便捷的方式创建表单:
// 使用 Laravel Collective 表单
{!! Form::open(['url' => route('login')]) !!}
{!! Form::label('email', 'Email') !!}
{!! Form::email('email', null, ['required' => true]) !!}
{!! Form::label('password', 'Password') !!}
{!! Form::password('password', ['required' => true]) !!}
{!! Form::submit('Login') !!}
{!! Form::close() !!}
2. 请求处理
Laravel 提供了多种方法来处理和管理用户请求。这些请求通常是通过 HTTP 表单提交到服务器,Laravel 会帮助我们接收、验证并处理这些请求。
2.1 获取请求数据
Laravel 提供了 Request 类来获取所有表单提交的数据,Request 类可以在控制器中作为依赖注入使用,或者直接通过 request() 辅助函数访问。
public function store(Request $request)
{
// 获取单个输入
$email = $request->input('email');
// 获取所有输入数据
$data = $request->all();
// 获取某个字段的默认值
$password = $request->input('password', 'default_password');
}
2.2 请求验证
表单数据提交后,通常需要进行验证,确保数据符合特定的规则。Laravel 提供了两种方式来进行表单验证:在控制器中直接验证或使用 Form Request。
2.2.1 控制器验证
在控制器方法中使用 validate() 方法来验证请求数据。如果验证失败,Laravel 会自动重定向用户并显示错误信息:
public function store(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required|min:6',
]);
// 验证通过,处理表单数据
// ...
}
2.2.2 Form Request 验证
Form Request 是 Laravel 提供的一种更清晰、更可复用的验证方式。首先使用 Artisan 命令生成一个 Form Request 类:
php artisan make:request StoreUserRequest
生成的请求类位于 app/Http/Requests 目录中。你可以在这个类中定义验证规则:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
public function authorize()
{
// 是否授权该请求
return true;
}
public function rules()
{
return [
'email' => 'required|email',
'password' => 'required|min:6',
];
}
}
然后,在控制器中使用这个请求类:
public function store(StoreUserRequest $request)
{
// 验证通过,处理数据
$validated = $request->validated();
// ...
}
2.3 处理请求文件上传
Laravel 还提供了非常简便的方法来处理文件上传。你可以通过 Request 对象的 file() 方法来获取上传的文件。
public function store(Request $request)
{
$request->validate([
'avatar' => 'required|image|max:2048',
]);
if ($request->hasFile('avatar')) {
$file = $request->file('avatar');
// 保存文件
$path = $file->store('avatars', 'public');
// 获取文件路径
$filePath = $file->path();
}
}
在表单中上传文件时,记得设置 enctype="multipart/form-data":
<form action="{{ route('profile.update') }}" method="POST" enctype="multipart/form-data">
@csrf
<label for="avatar">Upload Avatar</label>
<input type="file" name="avatar">
<button type="submit">Submit</button>
</form>
2.4 处理请求重定向和反馈
表单提交之后,你可能希望将用户重定向到某个页面,并给出反馈消息。Laravel 提供了 with() 方法来传递消息到重定向页面。
public function store(Request $request)
{
$request->validate([
'name' => 'required|string',
]);
// 处理数据
// ...
return redirect()->route('home')->with('status', 'Profile updated successfully!');
}
在视图中,你可以通过以下方式显示状态消息:
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
3. CSRF 防护
Laravel 自动启用了 CSRF(跨站请求伪造)防护。你只需确保表单包含 @csrf 指令,Laravel 会自动为表单生成并验证 CSRF 令牌:
<form method="POST" action="/somewhere">
@csrf
<input type="text" name="name">
<button type="submit">Submit</button>
</form>
4. 请求生命周期与中间件
Laravel 提供了中间件来处理请求的生命周期。你可以在中间件中执行一些常见的请求处理操作,如验证用户认证、权限等。
例如,可以创建一个中间件来验证某些表单字段的存在:
public function handle($request, Closure $next)
{
if (!$request->has('email')) {
return redirect()->route('form')
->with('error', 'Email is required!');
}
return $next($request);
}