Laravel 5.1中的Password::reset函数返回passwords.password。

4

我在控制器中有这个函数,但是由于我想将字符长度改为5位数,所以无法重置密码。

public function postReset(Request $request)
{
  $this->validate($request, [
    'token' => 'required',
    'password' => 'required|confirmed|digits:5',
  ]);

  $credentials = $request->only(
    'email', 'password', 'password_confirmation', 'token'
  );

  $response = Password::reset($credentials, function ($user, $password) {
    $this->resetPassword($user, $password);
  });

  dd($response);
  switch ($response) {
    case Password::PASSWORD_RESET:
      return redirect($this->redirectPath());

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

protected function resetPassword($user, $password)
{
  $user->password = bcrypt($password);
  $user->save();
  Auth::login($user);
}

但是它总是说:

哎呀!您的输入存在一些问题。

密码必须至少为六个字符,并与确认密码匹配。

当我添加了以下内容时:

dd($response);

输出:

passwords.password

有什么解决办法吗?


1
passwords.password 表示您的密码有问题。很可能它的长度不到6个字符。 - AliRNazari
尝试使用 dd($request->all()); - AliRNazari
@Ali,我执行了dd($request->all());,一切正常,密码、确认密码和电子邮件都返回了。 - Karim Samir
@Ali,是的,它少于6个字符,这就是我想要更改的,参见上面的规则。 - Karim Samir
1
你是否在使用自定义验证消息?通常情况下,Laravel会将这两个验证错误作为单独的句子返回。 - Zoe Blair
4个回答

3
这是因为在 Illuminate\Auth\Passwords\PasswordBroker 中有硬编码验证的原因。
当调用 reset 方法时,它会始终首先调用 validateReset,这又会调用 validateNewPassword
public function validateNewPassword(array $credentials)
{
    list($password, $confirm) = [
        $credentials['password'],
        $credentials['password_confirmation'],
    ];

    if (isset($this->passwordValidator)) {
        return call_user_func(
            $this->passwordValidator, $credentials) && $password === $confirm;
    }

    return $this->validatePasswordWithDefaults($credentials);
}

默认情况下,passwordValidator未设置。因此,validatePasswordWithDefaults将要求密码至少为6个字符长。
您可以使用Password::validator设置一个passwordValidator,它接受一个闭包函数,该函数必须返回一个布尔值,指示给定的凭据是否有效。这需要在Password::reset之前完成。
例如,将验证器更改为要求密码恰好为5个字符长将满足您的特定要求。
Password::validator(function($credentials)
{
    return strlen($credentials['password']) === 5;
});

2
你需要找的内容在这个类中:
\Illuminate\Auth\Passwords\PasswordBroker

这个函数的作用是:
validatePasswordWithDefaults

这个函数中 6 是硬编码的,看起来有点奇怪。 我猜可能有更好的做法来修改它。 也许你可以在控制器中重写该函数。试试看吧。


1

更改此行:

'password' => 'required|confirmed|digits:5'

'password' => 'required|confirmed|min:5'

我希望它是5位数字,而不仅仅是5个字符。 - Karim Samir
1
如果你想使用 digits,你的输入必须是 numeric - smartrahat

0

如果您想更改文本并覆盖密码,请按照以下步骤进行操作

首先,前往PasswordBroker.php

vendor\laravel\framework\src\Illuminate\Contracts\Auth\PasswordBroker.php

前往第35行并在此处进行更改

const INVALID_PASSWORD =  '**any thing you want**';

如果您想更改验证,则按照以下步骤操作

首先转到PasswordBroker.php

vendor\laravel\framework\src\Illuminate\Auth\Passwords\PasswordBroker.php

前往第176行并在此更改

return $password === $confirm && mb_strlen($password) >= **any digit you want**;

然后进入 ResetsPasswords.php

vendor\laravel\framework\src\Illuminate\Foundation\Auth\ResetsPasswords.php

前往第69行并进行更改

'password' => 'required|confirmed|min:**degit you chose in **PasswordBroker.php****',

谢谢...它有效了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接