Does anybody know how to customize ResetPassword logic in Laravel. I want to use custom field 'phone' vs 'email'. Small workaround with create_passwords_resets migration and done
public function up()
{
    Schema::create('password_resets', function (Blueprint $table) {
        $table->string('phone')->index();
        $table->string('token');
        $table->timestamp('created_at')->nullable();
    });
}
But i've started to get exceptions on absent field 'email' users tables simply doesn't have it all.
I'm just trying to use Password::Facade like
$status = Password::sendResetLink($request->only('phone'));
Why in such customizable platform hard-coded things like DatabaseTokenRepository even exist?
   public function exists(CanResetPasswordContract $user, $token)
{
    $record = (array) $this->getTable()->where(
        'email', $user->getEmailForPasswordReset()
    )->first();
    return $record &&
           ! $this->tokenExpired($record['created_at']) &&
             $this->hasher->check($token, $record['token']);
}
How can i override it?
If i try to implement one of the answers on Stack doing this:
namespace App\Auth;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Auth\Passwords\DatabaseTokenRepository as DatabaseTokenRepositoryBase;
use Illuminate\Support\Carbon;
class DatabaseTokenRepository extends DatabaseTokenRepositoryBase
{
public function create(CanResetPasswordContract $user)
{
    $email = $user->getEmailForPasswordReset();
    $mobile = $user->getMobileForPasswordReset();
    $this->deleteExisting($user);
    $token = $this->createNewToken();
    $this->getTable()->insert($this->getPayload($email, $mobile, $token));
    return $token;
}
protected function deleteExisting(CanResetPasswordContract $user)
{
    return $this->getTable()
        ->where("email", $user->getEmailForPasswordReset())
        ->orWhere("mobile", $user->getMobileForPasswordReset())
        ->delete();
}
protected function getPayload($email, $mobile, $token): array
{
    return [
        "email" => $email,
        "mobile" => $mobile,
        "token" => $this->hasher->make($token),
        "created_at" => new Carbon(),
    ];
}
public function exists(CanResetPasswordContract $user, $token)
{
    $record = (array)$this->getTable()
        ->where("email", $user->getEmailForPasswordReset())
        ->orWhere("mobile", $user->getMobileForPasswordReset())
        ->first();
    return $record &&
           ! $this->tokenExpired($record["created_at"]) &&
             $this->hasher->check($token, $record["token"]);
}
It throws exception like:
"Declaration of App\Auth\DatabaseTokenRepository::getPayload($email, $mobile, $token) must be compatible with Illuminate\Auth\Passwords\DatabaseTokenRepository::getPayload($email, $token)"