使用数据库提供商在 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 更改为类似于我的用户模型。
好的,这是我的第一个 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 更改为类似于我的用户模型。