Laravel 11 CRUD with upload image
Download Laravel App
https://laravel.com/docs/11.x/installation
composer global require laravel/installer
C:\xampp\htdocs\laravel11\myapp>composer global require laravel/installer
Connecting our Database
open .env file root directory.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=laravel11dev
DB_USERNAME=root
DB_PASSWORD=root
run this migration
C:\xampp\htdocs\laravel\laravel11\myapp>php artisan migrate
add photo to users table
php artisan make:migration add_photo_to_users_table --table=users
Update migration file
database/migrations/add_photo_to_users_table.php
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('photo')->nullable()->after('email');
});
}
run this migration
C:\xampp\htdocs\laravel\laravel11\myapp>php artisan migrate
update User Model add photo field as $fillable in User model.
protected $fillable = [
'name',
'email',
'password',
'photo',
];
Create Controller
php artisan make:controller UserController -r
C:\xampp\htdocs\laravel\laravel10project>php artisan make:controller UserController -r
app\Http\Controllers\UserController.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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | //app\Http\Controllers\UserController.php< <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\File; class UserController extends Controller { /** * Display a listing of the resource. */ public function index() { $users = User::latest( 'id' )->get(); return view( 'admin.index' , compact( 'users' )); } /** * Show the form for creating a new resource. */ public function create() { $title = "Add New User" ; return view( 'admin.add_edit_user' , compact( 'title' )); } /** * Store a newly created resource in storage. */ public function store(Request $request ) { $request ->validate( [ 'name' => 'required' , 'email' => 'required|email|unique:users' , 'photo' => 'mimes:png,jpeg,jpg|max:2048' , ] ); $filePath = public_path( 'uploads' ); $insert = new User(); $insert ->name = $request ->name; $insert ->email = $request ->email; $insert ->password = bcrypt( 'password' ); if ( $request ->hasfile( 'photo' )) { $file = $request ->file( 'photo' ); $file_name = time() . $file ->getClientOriginalName(); $file ->move( $filePath , $file_name ); $insert ->photo = $file_name ; } $result = $insert ->save(); Session::flash( 'success' , 'User registered successfully' ); return redirect()->route( 'user.index' ); } /** * Display the specified resource. */ public function show(string $id ) { // } /** * Show the form for editing the specified resource. */ public function edit( $id ) { $title = "Update User" ; $edit = User::findOrFail( $id ); return view( 'admin.add_edit_user' , compact( 'edit' , 'title' )); } /** * Update the specified resource in storage. */ public function update(Request $request , $id ) { $request ->validate( [ 'name' => 'required' , 'email' => 'required|email|unique:users,email,' . $id , 'photo' => 'mimes:png,jpeg,jpg|max:2048' , ] ); $update = User::findOrFail( $id ); $update ->name = $request ->name; $update ->email = $request ->email; if ( $request ->hasfile( 'photo' )) { $filePath = public_path( 'uploads' ); $file = $request ->file( 'photo' ); $file_name = time() . $file ->getClientOriginalName(); $file ->move( $filePath , $file_name ); // delete old photo if (! is_null ( $update ->photo)) { $oldImage = public_path( 'uploads/' . $update ->photo); if (File::exists( $oldImage )) { unlink( $oldImage ); } } $update ->photo = $file_name ; } $result = $update ->save(); Session::flash( 'success' , 'User updated successfully' ); return redirect()->route( 'user.index' ); } /** * Remove the specified resource from storage. */ public function destroy(Request $request ) { $userData = User::findOrFail( $request ->user_id); $userData -> delete (); // delete photo if exists if (! is_null ( $userData ->photo)) { $photo = public_path( 'uploads/' . $userData ->photo); if (File::exists( $photo )) { unlink( $photo ); } } Session::flash( 'success' , 'User deleted successfully' ); return redirect()->route( 'user.index' ); } } |
resources/views/admin/index.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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | //resources/views/admin/index.blade.php @ extends ( 'layouts.content' ) @section( 'main-content' ) <div class = "container" > <h2> Laravel 11 CRUD with upload image </h2> <div class = "text-end mb-5" > <a href= "{{ route('user.create') }}" class = "btn btn-primary" >Add New User</a> </div> @ if (session( 'success' )) <div class = "alert alert-success" > {{ session( 'success' ) }} </div> @ endif @ if (session( 'error' )) <div class = "alert alert-danger" > {{ session( 'error' ) }} </div> @ endif <div class = "table-responsive" > <table class = "table table-hover" > <thead class = "table-primary" > <th>#</th> <th>Name</th> <th>Email</th> <th>Photo</th> <th>Action</th> </thead> <tbody> @forelse( $users as $index => $row ) <tr> <td>{{ $index + 1 }}</td> <td>{{ $row ->name }}</td> <td>{{ $row ->email }}</td> <td> <div class = "showPhoto" > <div id= "imagePreview" style= "@if ($row->photo != '') background-image:url('{{ url('/') }}/uploads/{{ $row->photo }}')@else background-image: url('{{ url('/img/avatar.png') }}') @endif;" > </div> </div> </td> <td> <a href={{ route( 'user.edit' , [ 'id' => $row ->id]) }} class = "btn btn-primary" > Edit</a> <button class = "btn btn-danger" onClick= "deleteFunction('{{ $row->id }}')" > Delete </button> </td> </tr> @ empty <tr> <td colspan= "5" >No Users Found</td> </tr> @endforelse </tbody> </table> </div> </div> @ include ( 'admin.modal_delete' ) @endsection @push( 'js' ) <script> function deleteFunction(id) { document.getElementById( 'delete_id' ).value = id; $( "#modalDelete" ).modal( 'show' ); } </script> @endpush <style> .showPhoto { width: 51%; height: 54px; margin: auto; } .showPhoto>div { width: 100%; height: 100%; border-radius: 50%; background-size: cover; background-repeat: no-repeat; background-position: center; } </style> |
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/admin/add_edit_user.blade.php @ extends ( 'layouts.content' ) @section( 'main-content' ) <div class = "container" > <div class = "col-md-12" > <div class = "form-appl" > <h3>{{ $title }}</h3> <form class = "form1" method= "post" action= "@if (isset($edit->id)) {{ route('user.update', ['id' => $edit->id]) }}@else{{ route('user.store') }} @endif" enctype= "multipart/form-data" > @csrf <div class = "form-group col-md-12 mb-3" > <label for = "" >Your Name</label> <input class = "form-control" type= "text" name= "name" placeholder= "Enter Your Name" value= "@if (isset($edit->id)) {{ $edit->name }}@else {{ old('name') }} @endif" > @error( 'name' ) <div class = "text-danger" >{{ $message }}</div> @enderror </div> <div class = "form-group col-md-12 mb-3" > <label for = "" >Your Email</label> <input class = "form-control" type= "text" name= "email" placeholder= "Enter Your Email" value= "@if (isset($edit->id)) {{ $edit->email }}@else {{ old('email') }} @endif" > @error( 'email' ) <div class = "text-danger" >{{ $message }}</div> @enderror </div> <div class = "form-group col-md-12 mb-5" > <label for = "" >Photo</label> <div class = "avatar-upload" > <div> <input type= 'file' id= "imageUpload" name= "photo" accept= ".png, .jpg, .jpeg" onchange= "previewImage(this)" /> <label for = "imageUpload" ></label> </div> <div class = "avatar-preview" > <div id= "imagePreview" style= "@if (isset($edit->id) && $edit->photo != '') background-image:url('{{ url('/') }}/uploads/{{ $edit->photo }}')@else background-image: url('{{ url('/img/avatar.png') }}') @endif" ></div> </div> </div> @error( 'photo' ) <div class = "text-danger" >{{ $message }}</div> @enderror </div> <input type= "submit" class = "btn btn-primary" value= "Submit" > <a class = "btn btn-danger" href= "{{ route('user.index') }}" >Cancel</a> </form> </div> </div> </div> @endsection @push( 'js' ) <script type= "text/javascript" > function previewImage(input) { if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { $( "#imagePreview" ).css( 'background-image' , 'url(' + e.target.result + ')' ); $( "#imagePreview" ).hide(); $( "#imagePreview" ).fadeIn(700); } reader.readAsDataURL(input.files[0]); } } </script> @endpush <style> .avatar-upload { position: relative; max-width: 205px; } .avatar-upload .avatar-preview { width: 67%; height: 147px; position: relative; border-radius: 3%; border: 6px solid #F8F8F8; } .avatar-upload .avatar-preview>div { width: 100%; height: 100%; border-radius: 3%; background-size: cover; background-repeat: no-repeat; background-position: center; } </style> |
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 | //resources/views/admin/modal_delete.blade.php <!-- Modal --> <div class = "modal fade" id= "modalDelete" tabindex= "-1" role= "dialog" aria-labelledby= "modalDeleteTitle" aria-hidden= "true" > <div class = "modal-dialog modal-dialog-centered" role= "document" > <div class = "modal-content" > <form action= "{{ route('user.delete') }}" method= "post" > {{ csrf_field() }} <input type= "hidden" name= "user_id" id= "delete_id" > <div> <center> <h1>!</h1> </center> </div> <div class = "modal-body" > <center> <h1>Are You Sure?</h1> <h6>You want to Delete the user!</h6> </center> </div> <div class = "row" style= "margin-bottom: 50px; text-align: center;" > <div class = "col-sm-3" ></div> <div class = "col-sm-3" > <button type= "button" class = "btn btn-danger btn-modal" data-bs-dismiss= "modal" >Cancel</button> </div> <div class = "col-sm-3" > <button type= "submit" class = "btn btn-success btn-modal" > Delete </button> </div> <div class = "col-sm-3" ></div> </div> </form> </div> </div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 | //resources/views/layouts/header.blade.php <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "utf-8" /> <meta http-equiv= "X-UA-Compatible" content= "IE=edge" > <title>Laravel 11 CRUD with upload image</title> <meta name= "viewport" content= "width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" > <meta name= "_token" content= "{{ csrf_token() }}" > <link rel= "stylesheet" href= "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" /> </head> |
1 2 3 4 5 6 7 8 9 10 | //resources/views/layouts/content.blade.php @ include ( 'layouts.header' ) <body> @yield( 'main-content' ) @ include ( 'layouts.footer' ) @stack( 'js' ) </body> </html> |
1 2 3 4 | // resources/views/layouts/footer.blade.php |
routes/web.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //routes/web.php <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\UserController; Route::get( '/' , function () { return view( 'welcome' ); }); Route::get( '/admin' , [UserController:: class , 'index' ])->name( 'user.index' ); Route::group([ 'prefix' => 'admin/user' ], function () { Route::get( '/create' , [UserController:: class , 'create' ])->name( 'user.create' ); Route::post( '/add' , [UserController:: class , 'store' ])->name( 'user.store' ); Route::get( '/edit/{id}' , [UserController:: class , 'edit' ])->name( 'user.edit' ); Route::post( '/update/{id}' , [UserController:: class , 'update' ])->name( 'user.update' ); Route::post( '/delete' , [UserController:: class , 'destroy' ])->name( 'user.delete' ); }); |
Starting Laravel development server: http://127.0.0.1:8000
Github - Laravel 11 CRUD with upload image