如何在Laravel控制器中使用请求验证实现用户注册表单验证?
Laravel 注册表单验证完整实现
表单视图(带错误回显)
首先确保你的Blade表单能保留用户输入并显示错误信息:
<form method="POST" action="{{ route('register') }}"> @csrf <div> <label for="name">姓名</label> <input id="name" type="text" name="name" value="{{ old('name') }}" required autofocus> @error('name') <span class="text-red-500">{{ $message }}</span> @enderror </div> <div> <label for="email">邮箱</label> <input id="email" type="email" name="email" value="{{ old('email') }}" required> @error('email') <span class="text-red-500">{{ $message }}</span> @enderror </div> <div> <label for="password">密码</label> <input id="password" type="password" name="password" required> @error('password') <span class="text-red-500">{{ $message }}</span> @enderror </div> <div> <label for="password_confirmation">确认密码</label> <input id="password_confirmation" type="password" name="password_confirmation" required> @error('password_confirmation') <span class="text-red-500">{{ $message }}</span> @enderror </div> <button type="submit">注册</button> </form>
old('字段名')保留用户之前输入的内容,提升体验@error指令自动读取Laravel存入session的错误信息
控制器内直接验证(快速实现)
以下是符合你需求的完整代码,Laravel会自动处理错误重定向:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use App\Models\User; class RegisterController extends Controller { public function showRegistrationForm() { return view('auth.register'); } public function register(Request $request) { // 执行验证,自动处理错误重定向 $validated = $request->validate([ 'name' => 'required|string|regex:/^[A-Za-z\s]+$/|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/', 'password_confirmation' => 'required|string|same:password', ], [ // 自定义友好错误提示(可选) 'name.regex' => '姓名只能包含字母和空格', 'email.unique' => '该邮箱已被注册', 'password.regex' => '密码必须包含大小写字母和数字', 'password_confirmation.same' => '两次密码输入不一致', ]); // 验证通过后创建用户 User::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => Hash::make($validated['password']), ]); return redirect()->route('login')->with('success', '注册成功,请登录'); } }
- 验证规则说明:
- 姓名:必填、字符串、仅允许字母和空格、最大255字符
- 邮箱:必填、合法格式、在
users表中唯一 - 密码:必填、至少8位、包含大小写字母和数字
- 确认密码:必填、与密码字段值一致
自定义请求类(推荐,代码解耦)
对于复杂验证逻辑,用自定义请求类更规范:
- 生成请求类:
php artisan make:request RegisterRequest
- 编辑
app/Http/Requests/RegisterRequest.php:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class RegisterRequest extends FormRequest { public function authorize() { return true; // 允许所有用户访问注册接口 } public function rules() { return [ 'name' => 'required|string|regex:/^[A-Za-z\s]+$/|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/', 'password_confirmation' => 'required|string|same:password', ]; } public function messages() { return [ 'name.regex' => '姓名只能包含字母和空格', 'email.unique' => '该邮箱已被注册', 'password.regex' => '密码必须包含大小写字母和数字', 'password_confirmation.same' => '两次密码输入不一致', ]; } }
- 控制器中使用:
public function register(RegisterRequest $request) { // $request已通过验证,直接使用 User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return redirect()->route('login')->with('success', '注册成功,请登录'); }
常见问题排查
如果之前验证失效,检查以下几点:
- 表单是否包含
@csrf令牌(缺少会导致419错误,请求被拒绝) - 路由是否正确配置为POST请求并指向控制器的
register方法 - 视图是否正确使用
@error指令显示错误信息 - 正则表达式是否正确(比如姓名的正则不要包含中文,密码正则确保覆盖大小写和数字)
内容的提问来源于stack exchange,提问作者Eric Walter
相关产品推荐
相关产品推荐

