我们继承了CakePHP代码库和架构。将它移植到Laravel 5.2.x,但我们必须维护架构,而不是使用电子邮件在架构中使用用户名。因此,我尝试使用用户名列重置密码重置。
我已将ResetPasswords :: sendResetLinkEmail拉入PasswordController以覆盖它并在用户名而不是电子邮件上验证,并将用户名传递给sendResetLink,以便用户可以进行身份验证:
public function sendResetLinkEmail(Request $request)
{
$this->validate($request, [
'username' => 'required|email',
]);
$broker = $this->getBroker();
$response = Password::broker($broker)->sendResetLink(
$request->only('username'), $this->resetEmailBuilder()
);
// ...
但是,在PasswordBroker中调用〜91行上的方法后抛出错误:
$token = $this->tokens->create($user); // line 91
现在我不知道这是怎么回事,因为它似乎在调用一个依赖注入PasswordBroker的接口,但它负责保存密码重置记录。
答案 0 :(得分:0)
好的,经过大量的烦恼,我发现了它。为了保留语义列用户名而不是使用电子邮件进行密码重置:
有两个步骤:
1)您需要将ResetsPasswords::sendResetLinkEmail
提取到您的PasswordController中,并让它验证并将用户名传递给sendResetLink,这是问题所在,但下面还包括完整性:
/**
* Send a reset link to the given user.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function sendResetLinkEmail(Request $request)
{
$this->validate($request, [
'username' => 'required|email',
]);
$broker = $this->getBroker();
$response = Password::broker($broker)->sendResetLink(
$request->only('username'), $this->resetEmailBuilder()
);
switch ($response) {
case Password::RESET_LINK_SENT:
return $this->getSendResetLinkEmailSuccessResponse($response);
case Password::INVALID_USER:
default:
return $this->getSendResetLinkEmailFailureResponse($response);
}
}
2)这个问题的关键似乎需要一段时间才能弄明白,但本质上是非常简单的,但据我所知,完全没有记载的是将用户模型上使用的特征CanResetPassword::getEmailForPasswordReset
更改为也使用用户名而不是电子邮件,你不想在CanResetPassword中覆盖,所以我从用户模型中删除了特征,并在应用程序命名空间中应用了我自己的副本:
namespace App\Traits\Auth;
trait CanResetPassword
{
/**
* Get the e-mail address where password reset links are sent.
*
* @return string
*/
public function getEmailForPasswordReset()
{
return $this->username;
}
}
现在您可以发送密码重置链接,并重置密码。希望这会有所帮助。