Download Laravel App
composer create-project --prefer-dist laravel/laravel my-app
C:\xampp\htdocs\laravel10project>composer create-project laravel/laravel laravel10project
Connecting our Database
open .env file root directory.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=root
DB_PASSWORD=
Create Controller AuthController
php artisan make:controller AuthController
C:\xampp\htdocs\laravel\laravel10project>php artisan make:controller AuthController
app\Http\Controllers\AuthController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | //app\Http\Controllers\AuthController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\ValidationException; class AuthController extends Controller { public function register() { return view( 'auth/register' ); } public function registerSave(Request $request ) { Validator::make( $request ->all(), [ 'name' => 'required' , 'email' => 'required|email' , 'password' => 'required|confirmed' ])->validate(); User::create([ 'name' => $request ->name, 'email' => $request ->email, 'password' => Hash::make( $request ->password), 'level' => 'Admin' ]); return redirect()->route( 'login' ); } public function login() { return view( 'auth/login' ); } public function loginAction(Request $request ) { Validator::make( $request ->all(), [ 'email' => 'required|email' , 'password' => 'required' ])->validate(); if (!Auth::attempt( $request ->only( 'email' , 'password' ), $request ->boolean( 'remember' ))) { throw ValidationException::withMessages([ 'email' => trans( 'auth.failed' ) ]); } $request ->session()->regenerate(); return redirect()->route( 'dashboard' ); } public function logout(Request $request ) { Auth::guard( 'web' )->logout(); $request ->session()->invalidate(); return redirect( '/login' ); } public function profile() { return view( 'profile' ); } } |
C:\xampp\htdocs\laravel\laravel10project>php artisan migrate
Install Tailwindcss and DaisyUI
https://tailwindcss.com/docs/guides/laravel
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
https://daisyui.com/
The most popular component library for Tailwind CSS
https://daisyui.com/docs/install/
npm i -D daisyui@latest
Then add daisyUI to your tailwind.config.js files:
plugins: [require("daisyui")],
Templates
create folder layouts new file app.blade.php resources/views/layouts/app.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | //resources/views/layouts/app.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "utf-8" > <meta http-equiv= "X-UA-Compatible" content= "IE=edge" > <meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" > <meta name= "description" content= "" > <meta name= "author" content= "" > <title>Dashboard</title> @vite( 'resources/css/app.css' ) </head> <body> <div class = "container mx-auto px-4" > <div class = "navbar bg-base-100" > <div class = "flex-1" > <a href= "{{ route('dashboard') }}" class = "btn btn-ghost text-xl" >Cairocoders</a> </div> <div class = "flex-none" > <div class = "dropdown dropdown-end" > <div tabindex= "0" role= "button" class = "btn btn-ghost btn-circle" > <div class = "indicator" > <svg xmlns= "http://www.w3.org/2000/svg" class = "h-5 w-5" fill= "none" viewBox= "0 0 24 24" stroke= "currentColor" > <path stroke-linecap= "round" stroke-linejoin= "round" stroke-width= "2" d= "M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z" /> </svg> <span class = "badge badge-sm indicator-item" >8</span> </div> </div> <div tabindex= "0" class = "mt-3 z-[1] card card-compact dropdown-content w-52 bg-base-100 shadow" > <div class = "card-body" > <span class = "font-bold text-lg" >8 Items</span> <span class = "text-info" >Subtotal: $999 </span> <div class = "card-actions" > <button class = "btn btn-primary btn-block" >View cart</button> </div> </div> </div> </div> <div class = "dropdown dropdown-end" > <div tabindex= "0" role= "button" class = "btn btn-ghost btn-circle avatar" > <div class = "w-10 rounded-full" > <img alt= "Tailwind CSS Navbar component" src= "https://daisyui.com/images/stock/photo-1534528741775-53994a69daeb.jpg" /> </div> </div> <ul tabindex= "0" class = "menu menu-sm dropdown-content mt-3 z-[1] p-2 shadow bg-base-100 rounded-box w-52" > <li> <a href= "{{ route('profile') }}" class = "justify-between" > Profile <span class = "badge" >New</span> </a> </li> <li><a>Settings</a></li> <li><a href= "{{ route('logout') }}" >Logout</a></li> </ul> </div> </div> </div> <div> <h1 class = "text-3xl" >@yield( 'title' )</h1> <div>@yield( 'contents' )</div> </div> </div> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //resources/views/dashboard.blade.php @ extends ( 'layouts.app' ) @section( 'title' , 'Laravel 10 Login Register with Tailwind CSS and DaisyUI | Custom Login register' ) @section( 'contents' ) <div> <div class = "hero min-h-screen" style= "background-image: url(https://daisyui.com/images/stock/photo-1507358522600-9f71e620c44e.jpg);" > <div class = "hero-overlay bg-opacity-60" ></div> <div class = "hero-content text-center text-neutral-content" > <div class = "max-w-md" > <h1 class = "mb-5 text-5xl font-bold" >Hello there</h1> <p class = "mb-5" >Provident cupiditate voluptatem et in. Quaerat fugiat ut assumenda excepturi exercitationem quasi. In deleniti eaque aut repudiandae et a id nisi.</p> <button class = "btn btn-primary" >Get Started</button> </div> </div> </div> </div> @endsection |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //resources/views/profile.blade.php @ extends ( 'layouts.app' ) @section( 'title' , 'Profile Settings' ) @section( 'contents' ) <hr /> <form method= "POST" enctype= "multipart/form-data" action= "" > <div> <label class = "label" > <span class = "text-base label-text" >Name</span> </label> <input name= "name" type= "text" value= "{{ auth()->user()->name }}" class = "w-full input input-bordered" /> </div> <div> <label class = "label" > <span class = "text-base label-text" >Email</span> </label> <input name= "email" type= "text" value= "{{ auth()->user()->email }}" class = "w-full input input-bordered" /> </div> <div class = "mt-6" > <button type= "submit" class = "btn btn-block" >Save Profile</button> </div> </form> @endsection |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | //resources/views/auth/login.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "utf-8" > <meta http-equiv= "X-UA-Compatible" content= "IE=edge" > <meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" > <meta name= "description" content= "" > <meta name= "author" content= "" > <title>Login</title> @vite( 'resources/css/app.css' ) </head> <body> <div class = "relative flex flex-col justify-center h-screen overflow-hidden" > <div class = "w-full p-6 m-auto bg-white rounded-md shadow-md ring-2 ring-gray-800/50 lg:max-w-xl" > <h1 class = "text-3xl font-semibold text-center text-gray-700" >Login</h1> <form action= "{{ route('login.action') }}" method= "POST" class = "space-y-4" > @csrf @ if ( $errors ->any()) <div role= "alert" class = "alert alert-warning" > <svg xmlns= "http://www.w3.org/2000/svg" class = "stroke-current shrink-0 h-6 w-6" fill= "none" viewBox= "0 0 24 24" > <path stroke-linecap= "round" stroke-linejoin= "round" stroke-width= "2" d= "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /> </svg> <ul> @ foreach ( $errors ->all() as $error ) <li>{{ $error }}</li> @ endforeach </ul> </div> @ endif <div> <label class = "label" > <span class = "text-base label-text" >Email</span> </label> <input name= "email" type= "email" placeholder= "Email Address" class = "w-full input input-bordered" /> </div> <div> <label class = "label" > <span class = "text-base label-text" >Password</span> </label> <input name= "password" type= "password" placeholder= "Enter Password" class = "w-full input input-bordered" /> </div> <div> <button type= "submit" class = "btn btn-block" >Login</button> </div> <div> <label class = "label cursor-pointer" > <span class = "label-text" >Remember me</span> <input name= "remember" type= "checkbox" checked= "checked" id= "customCheck" class = "checkbox checkbox-primary" /> </label> </div> <span>Don't have an account yet? <a href= "{{ route('register') }}" class = "text-blue-600 hover:text-blue-800 hover:underline" >Register</a></span> </form> </div> </div> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | //resources/views/auth/register.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "utf-8" > <meta http-equiv= "X-UA-Compatible" content= "IE=edge" > <meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" > <meta name= "description" content= "" > <meta name= "author" content= "" > <title>Register</title> @vite( 'resources/css/app.css' ) </head> <body> <div class = "relative flex flex-col justify-center h-screen overflow-hidden" > <div class = "w-full p-6 m-auto bg-white rounded-md shadow-md ring-2 ring-gray-800/50 lg:max-w-xl" > <h1 class = "text-3xl font-semibold text-center text-gray-700" >Register</h1> <form action= "{{ route('register.save') }}" method= "POST" class = "space-y-4" > @csrf <div> <label class = "label" > <span class = "text-base label-text" >Name</span> </label> <input name= "name" type= "text" placeholder= "Name" class = "w-full input input-bordered @error('name')is-invalid @enderror" /> @error( 'name' ) <span class = "text-red-600" >{{ $message }}</span> @enderror </div> <div> <label class = "label" > <span class = "text-base label-text" >Email</span> </label> <input name= "email" type= "email" placeholder= "Email Address" class = "w-full input input-bordered" /> @error( 'email' ) <span class = "text-red-600" >{{ $message }}</span> @enderror </div> <div> <label class = "label" > <span class = "text-base label-text" >Password</span> </label> <input name= "password" type= "password" placeholder= "Enter Password" class = "w-full input input-bordered" /> @error( 'password' ) <span class = "text-red-600" >{{ $message }}</span> @enderror </div> <div> <label class = "label" > <span class = "text-base label-text" >Confirm Password</span> </label> <input name= "password_confirmation" type= "password" placeholder= "Confirm Password" class = "w-full input input-bordered" /> @error( 'password_confirmation' ) <span class = "text-red-600" >{{ $message }}</span> @enderror </div> <div> <button type= "submit" class = "btn btn-block" >Register Account</button> </div> <span>Already have an account ? <a href= "{{ route('login') }}" class = "text-blue-600 hover:text-blue-800 hover:underline" >Login</a></span> </form> <div class = "flex items-center w-full my-4" > <hr class = "w-full" /> <p class = "px-3 " >OR</p> <hr class = "w-full" /> </div> <div class = "my-6 space-y-2" > <button aria-label= "Login with Google" type= "button" class = "flex items-center justify-center w-full p-2 space-x-4 border rounded-md focus:ring-2 focus:ring-offset-1 focus:ring-gray-400" > <path d= "M16.318 13.714v5.484h9.078c-0.37 2.354-2.745 6.901-9.078 6.901-5.458 0-9.917-4.521-9.917-10.099s4.458-10.099 9.917-10.099c3.109 0 5.193 1.318 6.38 2.464l4.339-4.182c-2.786-2.599-6.396-4.182-10.719-4.182-8.844 0-16 7.151-16 16s7.156 16 16 16c9.234 0 15.365-6.49 15.365-15.635 0-1.052-0.115-1.854-0.255-2.651z" > </path> </svg> <p>Login with Google</p> </button> <button aria-label= "Login with GitHub" role= "button" class = "flex items-center justify-center w-full p-2 space-x-4 border rounded-md focus:ring-2 focus:ring-offset-1 focus:ring-gray-400" > <path d= "M16 0.396c-8.839 0-16 7.167-16 16 0 7.073 4.584 13.068 10.937 15.183 0.803 0.151 1.093-0.344 1.093-0.772 0-0.38-0.009-1.385-0.015-2.719-4.453 0.964-5.391-2.151-5.391-2.151-0.729-1.844-1.781-2.339-1.781-2.339-1.448-0.989 0.115-0.968 0.115-0.968 1.604 0.109 2.448 1.645 2.448 1.645 1.427 2.448 3.744 1.74 4.661 1.328 0.14-1.031 0.557-1.74 1.011-2.135-3.552-0.401-7.287-1.776-7.287-7.907 0-1.751 0.62-3.177 1.645-4.297-0.177-0.401-0.719-2.031 0.141-4.235 0 0 1.339-0.427 4.4 1.641 1.281-0.355 2.641-0.532 4-0.541 1.36 0.009 2.719 0.187 4 0.541 3.043-2.068 4.381-1.641 4.381-1.641 0.859 2.204 0.317 3.833 0.161 4.235 1.015 1.12 1.635 2.547 1.635 4.297 0 6.145-3.74 7.5-7.296 7.891 0.556 0.479 1.077 1.464 1.077 2.959 0 2.14-0.020 3.864-0.020 4.385 0 0.416 0.28 0.916 1.104 0.755 6.4-2.093 10.979-8.093 10.979-15.156 0-8.833-7.161-16-16-16z" > </path> </svg> <p>Login with GitHub</p> </button> </div> </div> </div> </body> </html> |
routes/web.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | //routes/web.php <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\AuthController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider and all of them will | be assigned to the "web" middleware group. Make something great! | */ Route::get( '/' , function () { return view( 'welcome' ); }); Route::controller(AuthController:: class )->group( function () { Route::get( 'register' , 'register' )->name( 'register' ); Route::post( 'register' , 'registerSave' )->name( 'register.save' ); Route::get( 'login' , 'login' )->name( 'login' ); Route::post( 'login' , 'loginAction' )->name( 'login.action' ); Route::get( 'logout' , 'logout' )->middleware( 'auth' )->name( 'logout' ); }); Route::middleware( 'auth' )->group( function () { Route::get( 'dashboard' , function () { return view( 'dashboard' ); })->name( 'dashboard' ); Route::get( '/profile' , [App\Http\Controllers\AuthController:: class , 'profile' ])->name( 'profile' ); }); |
Starting Laravel development server: http://127.0.0.1:8000