首页 > 解决方案 > 在 Laravel ui auth forgot password 表单中更改输入名称

问题描述

我已经在同一个页面上合并了所有登录、创建用户和忘记密码,并且对于错误处理,3 个表单上的“电子邮件”输入应该不同。我已将登录表单的电子邮件输入中的名称设置为:默认为“电子邮件”。我将创建用户的名称设置为:“register-email”并更改了 RegisterController 中的“验证器”功能,因此它看起来像这样:

protected function validator(array $data)
{
    $validator = Validator::make($data, [
        'register-email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'],
        'register-password' => ['required', 'string', 'min:8', 'max:255', 'confirmed'],
    ]);
    $validator->setAttributeNames([
        'register-email' => 'email',
        'register-password' => 'password',
    ]);
    return $validator;
}

它就像一个魅力!

现在我在忘记表单上将电子邮件输入名称设置为“忘记电子邮件”,但我不知道如何更正 ForgotPasswordController 来处理这个问题。

我试图用更新的名称覆盖以下函数:

protected function validateEmail(Request $request)
{
    $request->validate(['forgot-email' => 'required|email']);
}
protected function credentials(Request $request)
{
    return $request->only('forgot-email');
}
protected function sendResetLinkFailedResponse(Request $request, $response)
{
    if ($request->wantsJson()) {
        throw ValidationException::withMessages([
            'forgot-email' => [trans($response)],
        ]);
    }

    return back()
        ->withInput($request->only('forgot-email'))
        ->withErrors(['forgot-email' => trans($response)]);
}

但我只是得到一个错误说:

SQLSTATE [42703]:未定义列:7 错误:列“忘记电子邮件”不存在第 1 行:从“用户”中选择 *,其中“忘记电子邮件”= $1 限制 1 ^(SQL:从“用户”中选择 * “忘记电子邮件” = test@domain.com 限制 1)

问题很明显,它认为 input-name 与列名相同,而这里不是这样。那么我如何告诉控制器使用“忘记电子邮件”作为电子邮件?

标签: phplaravellaravel-8

解决方案


我找到了解决方案。我只是将忘记电子邮件请求合并到 validateEmail 函数中的电子邮件请求,如下所示:

protected function validateEmail(Request $request)
{
    $request->merge(['email' => $request->get('forgot-email')]);
    $request->validate(['email' => 'required|email']);
}

protected function credentials(Request $request)
{
    return $request->only('email');
}

protected function sendResetLinkFailedResponse(Request $request, $response)
{
    if ($request->wantsJson()) {
        throw ValidationException::withMessages([
            'forgot-email' => [trans($response)],
        ]);
    }

    return back()
        ->withInput($request->only('email'))
        ->withErrors(['forgot-email' => trans($response)]);
}

更新:这只是解决方案的一部分。当我在刀片中执行 @error 时,错误仍然作为“电子邮件”发送

更新2:好的,如果验证失败,错误被绑定到“电子邮件”,但对于所有其他错误,它是:“忘记电子邮件”所以我只是将验证方法更改为验证“忘记电子邮件”而不是电子邮件和现在它似乎工作正常。validateEmail 函数现在看起来像这样:

protected function validateEmail(Request $request)
{
    $request->merge(['email' => $request->get('forgot-email')]);
    $request->validate(['forgot-email' => 'required|email']);
}

推荐阅读