如何将失败的注册验证重定向到 url 并在 laravel jetstream fortify 中使用锚点

How to redirect failed validate on register to an url with anchor in laravel jetstream fortify

如果我通过验证器更改验证->失败 return 重定向.....我收到错误,因为登录需要 $user 的实例,我发送了一个响应。

这个默认设置很好,但不适合我

public function create(array $input)
{
    Validator::make($input, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => $this->passwordRules(),
        'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '',
    ])->validate();

    return User::create([
        'name' => $input['name'],
        'email' => $input['email'],
        'password' => Hash::make($input['password']),
    ]);
}

那就是给我一个:

Illuminate\Auth\SessionGuard::login():参数 #1 ($user) 必须是类型 Illuminate\Contracts\Auth\Authenticatable,Illuminate\Http\RedirectResponse 给定,在 ....endor/laravel/fortify/src/Http/Controllers/RegisteredUserController.php 第 57 行

public function create(array $input)
{
   $validator = Validator::make($input, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => $this->passwordRules(),
        'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '',
    ]);

    if($validator->fails()) {
        return Redirect::to(URL::previous() . "#my-anchor")->withInput()->with('error', $validator->messages()->first());

    } //Thats I want

    return User::create([
        'name' => $input['name'],
        'email' => $input['email'],
        'password' => Hash::make($input['password']),
    ]);
}

我以前没有这样做过,但也许你可以找到自定义它的方法。 CreateNewUser 在 RegisteredUserController 的存储方法中被调用,第一个 return 是一个 User 的实例。所以在这你可以

if($validation->fails())
   return $validation->messages()->first();

并在存储方法中

public function store(Request $request, CreatesNewUsers $creator): RegisterResponse
{
     $user = $creator->create($request->all()));
     if($user instanceof User::class) {
        event(new Registered($user);
        
        $this->guard->login($user);

        return app(RegisterResponse::class);
     } else 
     return Redirect::to(URL::previous()."#my-anchor")->withInput()->with('error', $user);
}

试试这个,但我建议你如果 works 扩展这个 Register 控制器并修改这个 store 方法