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
//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');
}
}
Create the blade views resources/views/admin/index.blade.php
//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>
resources/views/admin/add_edit_user.blade.php
//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>
resources/views/admin/modal_delete.blade.php
//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>
resources/views/layouts/header.blade.php
//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>
resources/views/layouts/content.blade.php
//resources/views/layouts/content.blade.php
@include('layouts.header')
<body>
@yield('main-content')
@include('layouts.footer')
@stack('js')
</body>
</html>
resources/views/layouts/footer.blade.php
// resources/views/layouts/footer.blade.php <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/js/bootstrap.min.js"></script>Routes
routes/web.php
//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');
});
Run C:\xampp\htdocs\laravel\laravel11\myapp>php artisan serve Starting Laravel development server: http://127.0.0.1:8000
Github - Laravel 11 CRUD with upload image
