Laravel Jetstream后端验证错误后,如何返回注册页并显示错误状态?
解决Laravel Jetstream注册时手机号重复错误返回注册页的问题
步骤1:在验证规则中添加手机号的校验逻辑
你当前代码未对phonenum字段做前置验证,数据库唯一约束触发时会抛出SQL异常,导致跳转到默认错误页。需要在验证环节提前校验手机号唯一性,这样验证失败时会自动返回注册页并携带错误信息。
修改CreateNewUser类中的验证代码:
namespace App\Actions\Fortify; use App\Models\User; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Laravel\Fortify\Contracts\CreatesNewUsers; use Laravel\Jetstream\Jetstream; class CreateNewUser implements CreatesNewUsers { use PasswordValidationRules; /** * Validate and create a newly registered user. * * @param array $input * @return \App\Models\User */ public function create(array $input) { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], // 新增手机号验证规则 'phonenum' => ['required', 'string', 'max:11', 'unique:users'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', ])->validate(); return User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), 'phonenum' => $input['phonenum'] ]); } }
规则说明:
required:确保手机号字段不为空(若允许空可根据需求删除)string:限制字段为字符串类型max:11:适配国内手机号长度,可根据地区调整unique:users:校验手机号在用户表中唯一
步骤2:确保数据库层的唯一性约束(可选但推荐)
虽然前置验证已做校验,但为避免并发场景下的重复数据,建议保留数据库层面的唯一索引。若已添加可忽略,否则通过迁移实现:
- 创建迁移文件:
php artisan make:migration add_unique_constraint_to_phonenum_on_users_table
- 修改迁移文件:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up() { Schema::table('users', function (Blueprint $table) { $table->unique('phonenum'); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropUnique('phonenum'); }); } };
- 执行迁移:
php artisan migrate
步骤3:确保前端注册表单显示错误信息
在Jetstream的注册视图文件(通常为resources/views/auth/register.blade.php)中,给phonenum输入框添加错误提示区域:
<div> <x-label for="phonenum" value="{{ __('手机号') }}" /> <x-input id="phonenum" class="block mt-1 w-full" type="text" name="phonenum" :value="old('phonenum')" required autofocus /> <!-- 显示手机号的验证错误 --> @error('phonenum') <p class="mt-2 text-sm text-red-600">{{ $message }}</p> @enderror </div>
这样验证失败时,错误信息会自动显示在手机号输入框下方,页面停留在注册页,不会跳转到默认错误页。
内容的提问来源于stack exchange,提问作者wafi
相关产品推荐
相关产品推荐

