使用数据库提供商在 Laravel 项目上立即重置密码:"user must implement canresetpassword interface"

Resetting passwords out of the box on Laravel project with database provider: "user must implement canresetpassword interface"

好的,这是我的第一个 Laravel 项目。也是第一次在 lamp 上开发任何东西(我是一个 windows .NET 人,请保持温柔)。

我正在使用 Laravel 5.8(受限于我们的主机)并使用

创建了标准的开箱即用身份验证

php artisan make:auth

我正在使用 mySql 作为应用程序的数据库,创建了一个类似于标准用户模型字段的用户 table 并将我的用户提供程序更改为:

'users' => [
         'driver' => 'database',
         'table' => 'myDatabaseUserTableName',
     ],

所以...到目前为止一切似乎都正常。我可以注册用户,登录和注销。

奇怪的是,当我尝试执行记住密码选项时,我收到一个 UnexpectedValueException:用户必须在 PasswordBroker.php

上实现 CanResetPassword 接口

就我在这个话题上的进展而言(似乎从早期的 5.x 版本开始就是很多开发人员的问题)问题似乎来自代理的 getUser 方法而不使用用户模型 class 来检索用户,这似乎与我没有使用 Eloquent 标准用户提供程序这一事实有关(尽管我使用的是标准用户模型)。

我没有找到任何解释这个问题的解决方案,我想知道在我开始研究框架代码以查看我是否可以让它工作(或者更糟糕地尝试打破它!)之前是否有人可以帮助我解决这个问题! )

编辑:好的,我终于设法修复了该功能。我对这个解决方案并不完全满意table,但它确实有效,而且非常简单。

我将 post 我的解决方案作为答案,我完全愿意接受批评和关于如何改进它的评论。我也很想听听有关解决此问题的更好方法。

为了消除接口错误,我将 CanResetPasswordContract 接口添加到 GenericUser class,并使用 Illuminate\Auth\Passwords\CanResetPassword class 来实现该接口。

所以我刚刚添加了:

use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

在 laravel/framework/src/Illuminate/Auth/GenericUser.php 的开头,将 CanResetPasswordContract 添加到 class 的实现中,并调用 CanResetPassword class :

use canResetPassword;

在 class 代码中。

所以现在,GenericUser,PasswordBroker 用来检索密码恢复用户的 class,实现了接口,错误不再显示...

当然,这还不足以修复整个功能,因为 GenericUser 本身无法发送电子邮件。您需要允许它成为可通知的,为此您必须添加

use Illuminate\Notifications\Notifiable;

要文件,也要在class里面使用Notifiable。

此时,如果您再次尝试要求重设密码,您将收到一封电子邮件,其中包含允许重设密码的 url(假设您的 email.php 配置正确,那是)。但是如果你使用它,你会收到一个错误,因为 GenericUser 无法持久保存对数据库的更改。

因此您需要一个能够将数据保存到数据库的模型。

我添加了 Eloquent 模型,虽然我使用的是数据库提供程序,但 Eloquent 模型似乎适用于用户创建,所以我决定尝试:

use Illuminate\Database\Eloquent\Model;

并确保添加一个包含用户名称的变量 table。这两项更改都应在 GenericUser class:

中进行
protected $table = 'yourUserTableName';

此外,您还需要指明您的用户模型已经存在(在发送电子邮件之前会进行检查,否则不会发送电子邮件)。所以我添加了:

  $user->exists = true;

就在 vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php 的 resetPassword 方法上保存之前

完成所有这些修改后,重置密码功能终于可以使用了。

但是,我觉得我做的与我应该做的相反...我想告诉经纪人使用我的用户模型 class,而不是将 GenericUser 更改为类似于我的用户模型。