Laravel 9 adalah framework PHP yang powerful dan elegan untuk mengembangkan aplikasi web. Salah satu tugas paling mendasar dalam pengembangan web adalah implementasi CRUD (Create, Read, Update, Delete). CRUD memungkinkan kita untuk mengelola data dalam database. Dalam artikel ini, kita akan membahas cara membuat CRUD sederhana dengan Laravel 9 langkah demi langkah, sehingga Anda dapat memahami dasarnya dan mulai membangun aplikasi Anda sendiri. Mari kita mulai!
1. Persiapan Awal: Instalasi dan Konfigurasi Laravel 9
Sebelum melangkah lebih jauh, pastikan Anda sudah memiliki lingkungan pengembangan yang siap. Ini termasuk PHP (minimal versi 8.0), Composer, dan database (seperti MySQL atau PostgreSQL).
Langkah 1: Instalasi Laravel 9
Buka terminal atau command prompt Anda dan jalankan perintah berikut untuk membuat proyek Laravel 9 baru:
composer create-project laravel/laravel nama-proyek
Ganti nama-proyek
dengan nama proyek yang Anda inginkan. Proses instalasi akan mengunduh semua dependensi yang diperlukan.
Langkah 2: Konfigurasi Database
Setelah instalasi selesai, buka file .env
yang terletak di direktori root proyek Anda. Cari bagian yang berhubungan dengan konfigurasi database:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=nama_pengguna
DB_PASSWORD=password
Sesuaikan nilai-nilai di atas dengan kredensial database Anda. Pastikan database yang Anda tentukan (nama_database
) sudah dibuat di server database Anda.
Langkah 3: Menjalankan Server Pengembangan
Untuk menjalankan server pengembangan Laravel, gunakan perintah berikut:
php artisan serve
Buka browser Anda dan akses http://localhost:8000
. Jika Anda melihat halaman selamat datang Laravel, berarti instalasi dan konfigurasi sudah berhasil.
2. Membuat Model dan Migrasi: Struktur Data Kita
Selanjutnya, kita akan membuat model dan migrasi untuk tabel database yang akan kita gunakan. Misalkan kita akan membuat CRUD untuk data “Produk”.
Langkah 1: Membuat Model
Jalankan perintah berikut untuk membuat model Product
:
php artisan make:model Product
Ini akan membuat file Product.php
di direktori app/Models
.
Langkah 2: Membuat Migrasi
Kita akan membuat migrasi untuk membuat tabel products
di database. Jalankan perintah berikut:
php artisan make:migration create_products_table --create=products
Ini akan membuat file migrasi baru di direktori database/migrations
. Buka file migrasi tersebut dan tambahkan kode berikut di dalam method up()
:
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->text('deskripsi')->nullable();
$table->decimal('harga', 10, 2);
$table->integer('stok');
$table->timestamps();
});
Kode di atas mendefinisikan struktur tabel products
dengan kolom id
, nama
, deskripsi
, harga
, stok
, dan kolom timestamps
(created_at dan updated_at).
Langkah 3: Menjalankan Migrasi
Untuk menjalankan migrasi dan membuat tabel di database, gunakan perintah berikut:
php artisan migrate
Pastikan koneksi database Anda sudah benar sebelum menjalankan perintah ini.
3. Membuat Controller: Logika Bisnis CRUD
Controller adalah tempat logika bisnis CRUD kita akan ditempatkan.
Langkah 1: Membuat Controller
Jalankan perintah berikut untuk membuat controller ProductController
:
php artisan make:controller ProductController --resource
Opsi --resource
akan secara otomatis membuat method-method yang diperlukan untuk CRUD (index, create, store, show, edit, update, destroy). Controller akan dibuat di direktori app/Http/Controllers
.
Langkah 2: Implementasi Method di Controller
Buka file ProductController.php
dan isi method-method yang ada dengan logika bisnis CRUD. Berikut adalah contoh implementasinya:
<?php
namespace AppHttpControllers;
use AppModelsProduct;
use IlluminateHttpRequest;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return IlluminateHttpResponse
*/
public function index()
{
$products = Product::all();
return view('products.index', compact('products'));
}
/**
* Show the form for creating a new resource.
*
* @return IlluminateHttpResponse
*/
public function create()
{
return view('products.create');
}
/**
* Store a newly created resource in storage.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
*/
public function store(Request $request)
{
$request->validate([
'nama' => 'required',
'harga' => 'required|numeric',
'stok' => 'required|integer',
]);
Product::create($request->all());
return redirect()->route('products.index')
->with('success','Produk berhasil ditambahkan.');
}
/**
* Display the specified resource.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function show(Product $product)
{
return view('products.show', compact('product'));
}
/**
* Show the form for editing the specified resource.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function edit(Product $product)
{
return view('products.edit', compact('product'));
}
/**
* Update the specified resource in storage.
*
* @param IlluminateHttpRequest $request
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function update(Request $request, Product $product)
{
$request->validate([
'nama' => 'required',
'harga' => 'required|numeric',
'stok' => 'required|integer',
]);
$product->update($request->all());
return redirect()->route('products.index')
->with('success','Produk berhasil diubah.');
}
/**
* Remove the specified resource from storage.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function destroy(Product $product)
{
$product->delete();
return redirect()->route('products.index')
->with('success','Produk berhasil dihapus.');
}
}
Kode di atas menggunakan model Product
untuk berinteraksi dengan database. Setiap method menangani operasi CRUD yang berbeda:
index()
: Menampilkan daftar semua produk.create()
: Menampilkan form untuk membuat produk baru.store()
: Menyimpan produk baru ke database.show()
: Menampilkan detail satu produk.edit()
: Menampilkan form untuk mengedit produk.update()
: Memperbarui data produk di database.destroy()
: Menghapus produk dari database.
4. Membuat Views: Tampilan Antarmuka Pengguna
Views adalah tampilan antarmuka pengguna yang akan ditampilkan kepada pengguna. Kita akan membuat view untuk setiap operasi CRUD.
Langkah 1: Membuat Direktori Views
Buat direktori products
di dalam direktori resources/views
. Di dalam direktori ini, kita akan menyimpan semua view yang berhubungan dengan produk.
Langkah 2: Membuat File View
Buat file-file berikut di dalam direktori resources/views/products
:
index.blade.php
: Menampilkan daftar produk.create.blade.php
: Form untuk membuat produk baru.show.blade.php
: Menampilkan detail produk.edit.blade.php
: Form untuk mengedit produk.
Berikut adalah contoh isi dari setiap file view:
index.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Daftar Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Daftar Produk</h1>
<a href="{{ route('products.create') }}" class="btn btn-success mb-3">Tambah Produk</a>
@if ($message = Session::get('success'))
<div class="alert alert-success">
<p>{{ $message }}</p>
</div>
@endif
<table class="table table-bordered">
<tr>
<th>No</th>
<th>Nama</th>
<th>Harga</th>
<th>Stok</th>
<th width="280px">Aksi</th>
</tr>
@foreach ($products as $product)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $product->nama }}</td>
<td>{{ $product->harga }}</td>
<td>{{ $product->stok }}</td>
<td>
<form action="{{ route('products.destroy',$product->id) }}" method="POST">
<a class="btn btn-info" href="{{ route('products.show',$product->id) }}">Lihat</a>
<a class="btn btn-primary" href="{{ route('products.edit',$product->id) }}">Edit</a>
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">Hapus</button>
</form>
</td>
</tr>
@endforeach
</table>
{!! $products->links() !!}
</div>
</body>
</html>
create.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Tambah Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Tambah Produk</h1>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> Ada beberapa masalah dengan input Anda.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('products.store') }}" method="POST">
@csrf
<div class="mb-3">
<label for="nama" class="form-label">Nama:</label>
<input type="text" class="form-control" id="nama" name="nama" placeholder="Nama Produk">
</div>
<div class="mb-3">
<label for="deskripsi" class="form-label">Deskripsi:</label>
<textarea class="form-control" id="deskripsi" name="deskripsi" placeholder="Deskripsi Produk"></textarea>
</div>
<div class="mb-3">
<label for="harga" class="form-label">Harga:</label>
<input type="number" class="form-control" id="harga" name="harga" placeholder="Harga Produk">
</div>
<div class="mb-3">
<label for="stok" class="form-label">Stok:</label>
<input type="number" class="form-control" id="stok" name="stok" placeholder="Stok Produk">
</div>
<button type="submit" class="btn btn-primary">Simpan</button>
<a class="btn btn-secondary" href="{{ route('products.index') }}">Batal</a>
</form>
</div>
</body>
</html>
show.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Detail Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Detail Produk</h1>
<div class="mb-3">
<strong>Nama:</strong>
{{ $product->nama }}
</div>
<div class="mb-3">
<strong>Deskripsi:</strong>
{{ $product->deskripsi }}
</div>
<div class="mb-3">
<strong>Harga:</strong>
{{ $product->harga }}
</div>
<div class="mb-3">
<strong>Stok:</strong>
{{ $product->stok }}
</div>
<a class="btn btn-secondary" href="{{ route('products.index') }}">Kembali</a>
</div>
</body>
</html>
edit.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Edit Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Edit Produk</h1>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> Ada beberapa masalah dengan input Anda.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('products.update', $product->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3">
<label for="nama" class="form-label">Nama:</label>
<input type="text" class="form-control" id="nama" name="nama" placeholder="Nama Produk" value="{{ $product->nama }}">
</div>
<div class="mb-3">
<label for="deskripsi" class="form-label">Deskripsi:</label>
<textarea class="form-control" id="deskripsi" name="deskripsi" placeholder="Deskripsi Produk">{{ $product->deskripsi }}</textarea>
</div>
<div class="mb-3">
<label for="harga" class="form-label">Harga:</label>
<input type="number" class="form-control" id="harga" name="harga" placeholder="Harga Produk" value="{{ $product->harga }}">
</div>
<div class="mb-3">
<label for="stok" class="form-label">Stok:</label>
<input type="number" class="form-control" id="stok" name="stok" placeholder="Stok Produk" value="{{ $product->stok }}">
</div>
<button type="submit" class="btn btn-primary">Update</button>
<a class="btn btn-secondary" href="{{ route('products.index') }}">Batal</a>
</form>
</div>
</body>
</html>
Pastikan Anda sudah menginstall Bootstrap atau menggunakan CSS framework lainnya agar tampilan lebih menarik.
5. Mendefinisikan Routes: Menghubungkan URL dengan Controller
Routes mendefinisikan URL yang akan diakses pengguna dan menghubungkannya dengan method controller yang sesuai.
Langkah 1: Mengubah File web.php
Buka file routes/web.php
dan tambahkan kode berikut:
use AppHttpControllersProductController;
use IlluminateSupportFacadesRoute;
Route::resource('products', ProductController::class);
Baris kode Route::resource('products', ProductController::class);
secara otomatis membuat routes untuk semua method CRUD yang ada di ProductController
.
6. Uji Coba Aplikasi: Pastikan Semuanya Berjalan Lancar
Sekarang saatnya menguji aplikasi CRUD kita.
Langkah 1: Menjalankan Server Pengembangan
Pastikan server pengembangan Laravel sedang berjalan dengan perintah php artisan serve
.
Langkah 2: Mengakses Aplikasi di Browser
Buka browser Anda dan akses http://localhost:8000/products
. Anda akan melihat daftar produk (jika ada). Anda dapat menambahkan, mengedit, melihat detail, dan menghapus produk melalui antarmuka yang sudah kita buat.
7. Validasi Data: Keamanan dan Integritas Data
Validasi data sangat penting untuk memastikan data yang disimpan di database valid dan sesuai dengan yang diharapkan. Kita sudah menambahkan validasi sederhana di method store
dan update
di ProductController
. Laravel menyediakan fitur validasi yang sangat powerful dan fleksibel. Anda dapat memperluas validasi ini sesuai dengan kebutuhan aplikasi Anda. Anda bisa merujuk ke dokumentasi resmi Laravel untuk detail lebih lanjut mengenai validasi data.
8. Menggunakan Eloquent Relationships: Hubungan Antar Tabel
Jika aplikasi Anda melibatkan lebih dari satu tabel, Anda mungkin perlu menggunakan Eloquent relationships untuk mendefinisikan hubungan antar tabel. Misalnya, jika Anda memiliki tabel categories
dan setiap produk termasuk dalam satu kategori, Anda dapat mendefinisikan relationship belongsTo
di model Product
dan relationship hasMany
di model Category
.
Contoh:
Model Product.php
public function category()
{
return $this->belongsTo(Category::class);
}
Model Category.php
public function products()
{
return $this->hasMany(Product::class);
}
Dengan menggunakan relationships, Anda dapat dengan mudah mengakses data terkait. Misalnya, untuk mendapatkan kategori produk, Anda dapat menggunakan $product->category
.
9. Menggunakan Middleware: Otentikasi dan Otorisasi
Middleware digunakan untuk memfilter HTTP requests yang masuk ke aplikasi Anda. Middleware dapat digunakan untuk berbagai keperluan, seperti otentikasi, otorisasi, logging, dan lain-lain. Misalnya, Anda dapat menggunakan middleware auth
untuk memastikan hanya pengguna yang sudah login yang dapat mengakses halaman CRUD produk.
Contoh penggunaan middleware di route:
Route::resource('products', ProductController::class)->middleware('auth');
Ini akan memastikan bahwa hanya pengguna yang sudah login yang dapat mengakses semua route CRUD produk.
10. Optimasi Performa: Aplikasi Lebih Responsif
Setelah aplikasi CRUD Anda berfungsi dengan baik, penting untuk memperhatikan performa. Beberapa tips optimasi performa:
- Caching: Gunakan caching untuk menyimpan data yang sering diakses sehingga tidak perlu mengambilnya dari database setiap kali. Laravel menyediakan berbagai driver caching seperti Redis dan Memcached.
- Eager Loading: Saat mengambil data dengan relationships, gunakan eager loading untuk menghindari masalah N+1 queries.
- Indexing Database: Pastikan kolom yang sering digunakan dalam query sudah diindeks untuk mempercepat pencarian data.
- Pagination: Gunakan pagination untuk memecah data menjadi halaman-halaman kecil agar lebih mudah dikelola.
11. Keamanan Aplikasi: Melindungi Data dan Pengguna
Keamanan adalah aspek penting dalam pengembangan aplikasi web. Beberapa langkah keamanan yang perlu diperhatikan:
- CSRF Protection: Laravel secara otomatis menyediakan proteksi CSRF (Cross-Site Request Forgery). Pastikan Anda menggunakan
@csrf
di semua form. - XSS Prevention: Hindari menampilkan data yang diinput pengguna secara langsung. Gunakan fungsi escape seperti
{{ $product->nama }}
untuk mencegah XSS (Cross-Site Scripting). - SQL Injection Prevention: Gunakan Eloquent ORM Laravel yang secara otomatis melindungi dari SQL injection. Hindari menggunakan raw queries jika memungkinkan.
- Password Hashing: Jangan menyimpan password pengguna secara plain text. Gunakan fungsi hashing seperti
bcrypt()
untuk mengenkripsi password. - Otentikasi dan Otorisasi: Implementasikan sistem otentikasi dan otorisasi yang kuat untuk mengontrol akses ke berbagai bagian aplikasi.
12. Kesimpulan: Membuat Aplikasi CRUD Sederhana dengan Laravel 9
Dengan mengikuti langkah-langkah di atas, Anda telah berhasil membuat CRUD sederhana dengan Laravel 9 langkah demi langkah. Pemahaman tentang cara membuat CRUD sederhana dengan Laravel 9 ini adalah dasar yang kuat untuk mengembangkan aplikasi web yang lebih kompleks. Teruslah berlatih dan eksplorasi fitur-fitur Laravel lainnya untuk menjadi pengembang web yang handal. Selamat mencoba!