Developer Snippet Diary

Custom Login / Registration , forget Password in Laravel

1. Goto mail trap make account and config your laravel app. https://mailtrap.io/

2. Make authentication controller

php artisan make:model Authentication--controller //model with controller

3. Make login, register and do login, do register, logout routes

Route::controller(\App\Http\Controllers\AuthenticationController::class)->group(function () {
    Route::get('login','index')->name('login');
    Route::get('register','register')->name('register');
    Route::post('do_login','do_login')->name('do_login');
    Route::post('do_register','do_register')->name('do_register');
    Route::get('logout', 'logout')->name('logout');
});

4. CREATE VIEWS

>>auth>login.blade.php

@if(session()->has('status'))
{{session('status')}}

@elseif(session()->has('success'))
{{session('success')}}

@endif
@csrf

>>auth>>register.blade.php

@if ($errors->any())
    @foreach ($errors->all() as $error)

{{ $error }}


    @endforeach
@endif
@csrf

                          

>>auth>>reset.blade.php


@csrf

auth>>forgot-password.blade.php


@csrf

5. AuthenticationController.php

<?php
namespace App\Http\Controllers;
use Hash;
use Session;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
class AuthenticationController extends Controller
{
    public function index(){
        return view("auth.login");
    }

    public function do_login(Request $request){
         $request->validate([
            'email' => 'required',
            'password' => 'required',
        ]);
   
        $credentials = $request->only('email', 'password');
        if (Auth::attempt($credentials)) {
            return redirect()->intended('home')
                        ->with('success','Signed in');
        }
        return redirect("login")->with('status','Login details are not valid');
    }

    public function register(){
        //do_register
        return view("auth.register");
    }

    public function do_register(Request $request){
        //do_register
        $request->validate([
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed|min:6'
        ]);
        
        $user = \App\Models\User::create([
            'name' => $request->name,
            'email'=>$request->email,
            'password'=> Hash::make($request->password)
        ]);
        Auth::login($user);
        return redirect("home")->withSuccess('You have signed-in');
    }
    public function logout() {
        Session::flush();
        Auth::logout();
        return Redirect('login');
    }
}

FOR RESET

1. ADD THIS LINE INTO USER MODEL, CanResetPassword;

Illuminate\Auth\Passwords\CanResetPassword;
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable,CanResetPassword;
.....
}

add in routing web.php, you must provide default route names to make it working else error thrown

use Illuminate\Support\Facades\Route;
Route::controller(\App\Http\Controllers\AuthenticationController::class)->group(function () {
    /*********** RESET ***************/
    Route::get('forgot-password', 'forgot_password')->middleware('guest')->name('password.request');
    Route::post('forgot_password_init', 'forgot_password_init')->middleware('guest');

    Route::get('/reset-password/{token}', 'reset_password')->middleware('guest')->name('password.reset');
    Route::post('/reset_password_init', 'reset_password_init')->middleware('guest');
});

In controller Logic.

<?php
namespace App\Http\Controllers;
use Hash;
use Session;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

use Illuminate\Support\Facades\Password;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Support\Str;

class AuthenticationController extends Controller
{
    /*************** FORGET PASSWORD **************/
    public function forgot_password(){
        return view("auth.forgot-password");
    }
    public function forgot_password_init(Request $request){

         $request->validate(['email' => 'required|email']);
        $status = Password::sendResetLink(
            $request->only('email')
        );
        
        return $status === Password::RESET_LINK_SENT
                    ? back()->with('success',"link sent to your email")
                    : back()->with('status', "Email not found");
    }
    public function reset_password($token){
        return view('auth.reset-password', ['token' => $token]);
    }

    public function reset_password_init(Request $request){
        $request->validate([
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|confirmed',
        ]);
 
        $status = Password::reset(
        $request->only('email', 'password', 'password_confirmation', 'token'),
            function ($user, $password) {
                $user->forceFill([
                    'password' => Hash::make($password)
                ])->setRememberToken(Str::random(60));
     
                $user->save();
     
                event(new PasswordReset($user));
            }
        );
        return $status === Password::PASSWORD_RESET
                ? redirect()->route('login')->with('success', "Password Updated Successfully")
                : back()->with('status', "Not changed try again");
    }
}
Posted by: R GONDAL
Email: rizikmw@gmail.com