I was working on a Project where I had to change the default functionality of Forget and Reset Password to work with username instead on email.

Since Laravel's out of the box authentication functionality works very well and it does provide easy customization to change your Login to work with any other user property like username / mobile instead of email.

It's not the case with Forget/Reset Password functionality. This functionality code is highly depended on user's email and to change it I had to modify and extend couple of classes in my project.

If you are facing similar issue and you are looking to modify the Reset Password Functionality in Laravel. You need to extend the Illuminate\Auth\Passwords\PasswordBroker Class from Laravel's Authentication module.

But Even If you Extend this Class in your Project, It won't work because PasswordBroker Class is referred by PasswordBrokerManager which is registered in ServiceProvider. So there are a couple of steps involved.

1. Create a CustomPasswordResetServiceProvider inside App\Providers

You need to create a new CustomPasswordResetServiceProvider class which we will use to replace the Default PasswordResetServiceProvider

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\CustomPasswordBrokerManager; 
class CustomPasswordResetServiceProvider extends ServiceProvider{
    protected $defer = true;

    public function register()
    {
        $this->registerPasswordBrokerManager();
    }

    protected function registerPasswordBrokerManager()
    {
        $this->app->singleton('auth.password', function ($app) {
            return new CustomPasswordBrokerManager($app);
        });
    }

    public function provides()
    {
        return ['auth.password'];
    }
}

2. Replace Service Provider in app/config.php

Next, we need to replace the newly created ServiceProvider in our app/config.php

Open you app/config.php file and comment out PasswordResetServiceProvider and add new the ServiceProvider class.

//Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,

App\Providers\CustomPasswordResetServiceProvider::class,

3. Create new CustomPasswordBrokerManager class

Create a new class CustomPasswordBrokerManager and under directory App/Services and copy all the contents of PasswordBrokerManager  which is located at Illuminate\Auth\Passwords\PasswordBrokerManager.php

Then modified the function resolve to return an instance of my CustomPasswordProvider class

protected function resolve($name)
{
    $config = $this->getConfig($name);
    if (is_null($config)) {
        throw new InvalidArgumentException("Password resetter [{$name}] is not defined.");
    }

    return new CustomPasswordBroker(
        $this->createTokenRepository($config),
        $this->app['auth']->createUserProvider($config['provider'])
);
}

 

4. Create CustomPasswordBroker

Finally, You can now create your new CustomPasswordBroker class under App/Services directory which extends the default PasswordBroker class located at Illuminate\Auth\Passwords\PasswordBroker

use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker;    

class CustomPasswordBroker extends BasePasswordBroker    
{    
// override the functions that you need here    
}

Now, you can override the functions that you need. Mostly you will need to start your modification with function sendResetLink and then you can take it ahead from there.

Comments