Hi Guys,
Today, I will learn you how to custom forgot & reset password in laravel. we will show example of laravel custom forgot & reset password. you can easliy create custom forgot & reset password in laravel. This post will give you simple example of how to create custom forgot password in laravel. step by step explain laravel custom reset password email.
I will help to creating custom reset password function in php laravel. so basically, you can also create custom forget password with different models too.
Here, I will give you full example for simply laravel custom forgot & reset password as bellow.
Step 1: Install Laravel 8 Applicationwe are going from scratch, So we require to get fresh Laravel application using bellow command, So open your terminal OR command prompt and run bellow command:
composer create-project --prefer-dist laravel/laravel Laravel8TypeheadTutorialStep 2: Database Configuration
In this step, configure database with your downloded/installed laravel 8 app. So, you need to find .env file and setup database details as following:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db name DB_USERNAME=db user name DB_PASSWORD=db passwordStep 3: Create "password_resets" table
basically, it will already created "password_resets" table migration but if it's not created then you can create new migration as like bellow code:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePasswordResetsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('password_resets', function (Blueprint $table) { $table->string('email')->index(); $table->string('token'); $table->timestamp('created_at')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('password_resets'); } }Step 4: Create Route
In this is step we need to create custom route for forget and reset link. so open your routes/web.php file and add following route.
routes/web.php<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\Auth\ForgotPasswordController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('forget-password', [ForgotPasswordController::class, 'showForgetPasswordForm'])->name('forget.password.get'); Route::post('forget-password', [ForgotPasswordController::class, 'submitForgetPasswordForm'])->name('forget.password.post'); Route::get('reset-password/{token}', [ForgotPasswordController::class, 'showResetPasswordForm'])->name('reset.password.get'); Route::post('reset-password', [ForgotPasswordController::class, 'submitResetPasswordForm'])->name('reset.password.post');Step 5: Create Controller
Now step, we need to create ForgotPasswordController and add following code on that file:
app/Http/Controllers/Auth/ForgotPasswordController.php<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use DB; use Carbon\Carbon; use App\Models\User; use Mail; use Hash; use Illuminate\Support\Str; class ForgotPasswordController extends Controller { /** * Write code on Method * * @return response() */ public function showForgetPasswordForm() { return view('auth.forgetPassword'); } /** * Write code on Method * * @return response() */ public function submitForgetPasswordForm(Request $request) { $request->validate([ 'email' => 'required|email|exists:users', ]); $token = Str::random(64); DB::table('password_resets')->insert([ 'email' => $request->email, 'token' => $token, 'created_at' => Carbon::now() ]); Mail::send('email.forgetPassword', ['token' => $token], function($message) use($request){ $message->to($request->email); $message->subject('Reset Password'); }); return back()->with('message', 'We have e-mailed your password reset link!'); } /** * Write code on Method * * @return response() */ public function showResetPasswordForm($token) { return view('auth.forgetPasswordLink', ['token' => $token]); } /** * Write code on Method * * @return response() */ public function submitResetPasswordForm(Request $request) { $request->validate([ 'email' => 'required|email|exists:users', 'password' => 'required|string|min:6|confirmed', 'password_confirmation' => 'required' ]); $updatePassword = DB::table('password_resets') ->where([ 'email' => $request->email, 'token' => $request->token ]) ->first(); if(!$updatePassword){ return back()->withInput()->with('error', 'Invalid token!'); } $user = User::where('email', $request->email) ->update(['password' => Hash::make($request->password)]); DB::table('password_resets')->where(['email'=> $request->email])->delete(); return redirect('/login')->with('message', 'Your password has been changed!'); } }Step 6: Email Configuration
In this step,we will add email configuration on env file, because we will send email to reset password link from controller.
.envMAIL_DRIVER=smtp MAIL_HOST=smtp-mail.outlook.com MAIL_PORT=587 MAIL_USERNAME=example@hotmail.com MAIL_PASSWORD=123456789 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=example@hotmail.comStep 7: Create Blade Files
Now in this step,we need to create blade files for layout, login, register and home page. so let's create one by one files.
<html> <head> <title>Laravel</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <style type="text/css"> @import url(https://fonts.googleapis.com/css?family=Raleway:300,400,600); body{ margin: 0; font-size: .9rem; font-weight: 400; line-height: 1.6; color: #212529; text-align: left; background-color: #f5f8fa; } .navbar-laravel { box-shadow: 0 2px 4px rgba(0,0,0,.04); } .navbar-brand , .nav-link, .my-form, .login-form { font-family: Raleway, sans-serif; } .my-form { padding-top: 1.5rem; padding-bottom: 1.5rem; } .my-form .row { margin-left: 0; margin-right: 0; } .login-form { padding-top: 1.5rem; padding-bottom: 1.5rem; } .login-form .row { margin-left: 0; margin-right: 0; } </style> </head> <body> <nav class="navbar navbar-expand-lg navbar-light navbar-laravel"> <div class="container"> <a class="navbar-brand" href="#">Laravel</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav ml-auto"> @guest <li class="nav-item"> <a class="nav-link" href="{{ route('login') }}">Login</a> </li> <li class="nav-item"> <a class="nav-link" href="{{ route('register') }}">Register</a> </li> @else <li class="nav-item"> <a class="nav-link" href="{{ route('logout') }}">Logout</a> </li> @endguest </ul> </div> </div> </nav> @yield('content') </body> </html>resources/views/auth/forgetPassword.blade.php
@extends('layout') @section('content') <main class="login-form"> <div class="cotainer"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Reset Password</div> <div class="card-body"> @if (Session::has('message')) <div class="alert alert-success" role="alert"> {{ Session::get('message') }} </div> @endif <form action="{{ route('forget.password.post') }}" method="POST"> @csrf <div class="form-group row"> <label for="email_address" class="col-md-4 col-form-label text-md-right">E-Mail Address</label> <div class="col-md-6"> <input type="text" id="email_address" class="form-control" name="email" required autofocus> @if ($errors->has('email')) <span class="text-danger">{{ $errors->first('email') }}</span> @endif </div> </div> <div class="col-md-6 offset-md-4"> <button type="submit" class="btn btn-primary"> Send Password Reset Link </button> </div> </form> </div> </div> </div> </div> </div> </main> @endsectionresources/views/auth/forgetPasswordLink.blade.php
@extends('layout') @section('content') <main class="login-form"> <div class="cotainer"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Reset Password</div> <div class="card-body"> <form action="{{ route('reset.password.post') }}" method="POST"> @csrf <input type="hidden" name="token" value="{{ $token }}"> <div class="form-group row"> <label for="email_address" class="col-md-4 col-form-label text-md-right">E-Mail Address</label> <div class="col-md-6"> <input type="text" id="email_address" class="form-control" name="email" required autofocus> @if ($errors->has('email')) <span class="text-danger">{{ $errors->first('email') }}</span> @endif </div> </div> <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">Password</label> <div class="col-md-6"> <input type="password" id="password" class="form-control" name="password" required autofocus> @if ($errors->has('password')) <span class="text-danger">{{ $errors->first('password') }}</span> @endif </div> </div> <div class="form-group row"> <label for="password-confirm" class="col-md-4 col-form-label text-md-right">Confirm Password</label> <div class="col-md-6"> <input type="password" id="password-confirm" class="form-control" name="password_confirmation" required autofocus> @if ($errors->has('password_confirmation')) <span class="text-danger">{{ $errors->first('password_confirmation') }}</span> @endif </div> </div> <div class="col-md-6 offset-md-4"> <button type="submit" class="btn btn-primary"> Reset Password </button> </div> </form> </div> </div> </div> </div> </div> </main> @endsectionresources/views/email/forgetPassword.blade.php
<h1>Forget Password Email</h1> <p>You can reset password from bellow link:</p> <a href="{{ route('reset.password.get', $token) }}">Reset Password</a>resources/views/auth/login.blade.php
@extends('layout') @section('content') <main class="login-form"> <div class="cotainer"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Login</div> <div class="card-body"> <form action="{{ route('login.post') }}" method="POST"> @csrf <div class="form-group row"> <label for="email_address" class="col-md-4 col-form-label text-md-right">E-Mail Address</label> <div class="col-md-6"> <input type="text" id="email_address" class="form-control" name="email" required autofocus> @if ($errors->has('email')) <span class="text-danger">{{ $errors->first('email') }}</span> @endif </div> </div> <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">Password</label> <div class="col-md-6"> <input type="password" id="password" class="form-control" name="password" required> @if ($errors->has('password')) <span class="text-danger">{{ $errors->first('password') }}</span> @endif </div> </div> <div class="form-group row"> <div class="col-md-6 offset-md-4"> <div class="checkbox"> <label> <input type="checkbox" name="remember"> Remember Me </label> </div> </div> </div> <div class="form-group row"> <div class="col-md-6 offset-md-4"> <div class="checkbox"> <label> <a href="{{ route('forget.password.get') }}">Reset Password</a> </label> </div> </div> </div> <div class="col-md-6 offset-md-4"> <button type="submit" class="btn btn-primary"> Login </button> </div> </form> </div> </div> </div> </div> </div> </main> @endsection
Now we are ready to run our example so run bellow command so quick run:
php artisan serve
Now you can open bellow URL on your browser:
http://localhost:8000/It will help you...