You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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位、包含大小写字母和数字
    • 确认密码:必填、与密码字段值一致

自定义请求类(推荐,代码解耦)

对于复杂验证逻辑,用自定义请求类更规范:

  1. 生成请求类:
php artisan make:request RegisterRequest
  1. 编辑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' => '两次密码输入不一致',
        ];
    }
}
  1. 控制器中使用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:50:55