Laravel, framework PHP yang elegan dan powerful, menjadi pilihan utama bagi banyak developer web. Salah satu alasan popularitasnya adalah kemudahan dalam melakukan operasi CRUD (Create, Read, Update, Delete) yang merupakan fondasi utama dari hampir semua aplikasi web. Jika kamu seorang pemula yang ingin belajar membuat CRUD dengan Laravel 9, panduan lengkap ini akan membimbingmu langkah demi langkah. Jangan khawatir, kita akan membahas semuanya secara rinci, dari instalasi hingga implementasi, sehingga kamu bisa langsung praktik dan memahami konsepnya.
1. Persiapan Awal: Instalasi Laravel 9 dan Konfigurasi Database
Sebelum kita mulai membuat CRUD dengan Laravel 9, pastikan kamu sudah memiliki beberapa persyaratan dasar:
- PHP: Versi 8.0 ke atas (disarankan 8.1 atau 8.2).
- Composer: Dependency Manager untuk PHP. Kamu bisa mengunduhnya di https://getcomposer.org/.
- Database: Misalnya MySQL, PostgreSQL, atau SQLite. Panduan ini akan menggunakan MySQL sebagai contoh.
- Web Server: Misalnya Apache atau Nginx.
- Text Editor/IDE: Misalnya VS Code, Sublime Text, atau PHPStorm.
Setelah semua persyaratan terpenuhi, mari kita instal Laravel 9. Buka terminal/command prompt dan jalankan perintah berikut:
composer create-project laravel/laravel crud-app
cd crud-app
Perintah di atas akan membuat direktori baru bernama crud-app
dan menginstal Laravel 9 di dalamnya. Setelah instalasi selesai, masuk ke direktori crud-app
.
Selanjutnya, kita perlu mengkonfigurasi koneksi database. Buka file .env
di root direktori proyekmu. Cari baris yang diawali dengan DB_
. Ubah nilai-nilainya sesuai dengan konfigurasi database kamu. Contohnya:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=crud_db
DB_USERNAME=root
DB_PASSWORD=
Pastikan kamu mengganti crud_db
, root
, dan password dengan konfigurasi database yang kamu gunakan. Sekarang, Laravel sudah siap digunakan!
2. Membuat Model dan Migrasi: Definisi Struktur Database
Langkah selanjutnya dalam membuat CRUD dengan Laravel 9 adalah mendefinisikan struktur database. Kita akan membuat model dan migrasi untuk tabel yang akan menyimpan data. Misalkan kita ingin membuat aplikasi sederhana untuk mengelola data “Produk”.
Jalankan perintah berikut di terminal:
php artisan make:model Product -m
Perintah di atas akan membuat dua file:
app/Models/Product.php
(Model)database/migrations/[timestamp]_create_products_table.php
(Migrasi)
Buka file migrasi yang baru saja dibuat. Kamu akan melihat struktur dasar tabel. Modifikasi file tersebut sesuai dengan kolom-kolom yang kamu butuhkan. Contohnya:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description')->nullable();
$table->decimal('price', 10, 2);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('products');
}
};
Kode di atas akan membuat tabel products
dengan kolom id
, name
, description
, price
, created_at
, dan updated_at
. Setelah selesai memodifikasi file migrasi, jalankan perintah berikut untuk menjalankan migrasi dan membuat tabel di database:
php artisan migrate
Sekarang, tabel products
sudah ada di database kamu. Selanjutnya, kita akan memodifikasi model Product.php
. Buka file tersebut dan tambahkan kode berikut:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
protected $fillable = [
'name',
'description',
'price',
];
}
$fillable
digunakan untuk menentukan kolom mana saja yang boleh diisi secara massal (mass assignment).
3. Membuat Controller: Logika Bisnis Aplikasi CRUD Produk
Setelah model dan migrasi siap, langkah selanjutnya dalam membuat CRUD dengan Laravel 9 adalah membuat controller. Controller bertugas untuk menangani request dari user dan memproses data. Jalankan perintah berikut untuk membuat controller:
php artisan make:controller ProductController -r
-r
adalah opsi untuk membuat controller dengan method resource (index, create, store, show, edit, update, destroy) yang umum digunakan untuk CRUD. Buka file app/Http/Controllers/ProductController.php
. Kamu akan melihat struktur dasar controller dengan method-method yang sudah dibuat. Mari kita isi method-method tersebut dengan logika CRUD.
Method index
(Menampilkan Daftar Produk):
<?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'));
}
// ... Method lainnya ...
}
Method ini mengambil semua data produk dari database menggunakan Product::all()
dan mengirimkannya ke view products.index
. Kita akan membuat view ini nanti.
Method create
(Menampilkan Form Tambah Produk):
/**
* Show the form for creating a new resource.
*
* @return IlluminateHttpResponse
*/
public function create()
{
return view('products.create');
}
Method ini hanya menampilkan view products.create
yang berisi form untuk menambahkan produk baru.
Method store
(Menyimpan Data Produk Baru):
/**
* Store a newly created resource in storage.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required',
'price' => 'required|numeric',
]);
Product::create($request->all());
return redirect()->route('products.index')
->with('success','Produk berhasil ditambahkan.');
}
Method ini menerima data dari form (melalui $request
), melakukan validasi data, dan menyimpan data produk baru ke database menggunakan Product::create($request->all())
. Kemudian, redirect ke halaman products.index
dengan pesan sukses. Kita menggunakan validasi untuk memastikan data yang masuk valid sebelum disimpan.
Method show
(Menampilkan Detail Produk):
/**
* Display the specified resource.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function show(Product $product)
{
return view('products.show', compact('product'));
}
Method ini menerima satu instance Product
(melalui route parameter) dan menampilkannya di view products.show
.
Method edit
(Menampilkan Form Edit Produk):
/**
* Show the form for editing the specified resource.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function edit(Product $product)
{
return view('products.edit', compact('product'));
}
Method ini menerima satu instance Product
(melalui route parameter) dan menampilkan form edit produk di view products.edit
.
Method update
(Mengupdate Data Produk):
/**
* Update the specified resource in storage.
*
* @param IlluminateHttpRequest $request
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function update(Request $request, Product $product)
{
$request->validate([
'name' => 'required',
'price' => 'required|numeric',
]);
$product->update($request->all());
return redirect()->route('products.index')
->with('success','Produk berhasil diupdate.');
}
Method ini menerima data dari form (melalui $request
), melakukan validasi data, dan mengupdate data produk yang sudah ada di database menggunakan $product->update($request->all())
. Kemudian, redirect ke halaman products.index
dengan pesan sukses.
Method destroy
(Menghapus Data Produk):
/**
* 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.');
}
Method ini menerima satu instance Product
(melalui route parameter) dan menghapus data produk tersebut dari database menggunakan $product->delete()
. Kemudian, redirect ke halaman products.index
dengan pesan sukses.
4. Membuat Route: Menghubungkan URL dengan Controller
Setelah controller siap, kita perlu mendefinisikan route untuk menghubungkan URL dengan method controller yang sesuai. Buka file routes/web.php
. Tambahkan baris berikut:
<?php
use AppHttpControllersProductController;
use IlluminateSupportFacadesRoute;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::resource('products', ProductController::class);
Route::get('/', function () {
return view('welcome');
});
Route::resource('products', ProductController::class)
secara otomatis membuat route untuk semua method resource di ProductController
. Ini adalah cara yang efisien untuk mendefinisikan route CRUD.
5. Membuat View: Tampilan Antarmuka Pengguna (UI)
Langkah terakhir dalam membuat CRUD dengan Laravel 9 adalah membuat view. View adalah file yang berisi kode HTML dan logika tampilan untuk menampilkan data kepada user. Kita akan membuat beberapa view:
products/index.blade.php
(Daftar Produk)products/create.blade.php
(Form Tambah Produk)products/show.blade.php
(Detail Produk)products/edit.blade.php
(Form Edit Produk)
Buat direktori resources/views/products
. Di dalam direktori tersebut, buat file-file berikut.
resources/views/products/index.blade.php
:
<!DOCTYPE html>
<html>
<head>
<title>CRUD 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>Deskripsi</th>
<th>Harga</th>
<th width="280px">Aksi</th>
</tr>
@foreach ($products as $product)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $product->name }}</td>
<td>{{ $product->description }}</td>
<td>{{ $product->price }}</td>
<td>
<form action="{{ route('products.destroy',$product->id) }}" method="POST">
<a class="btn btn-info" href="{{ route('products.show',$product->id) }}">Show</a>
<a class="btn btn-primary" href="{{ route('products.edit',$product->id) }}">Edit</a>
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">Delete</button>
</form>
</td>
</tr>
@endforeach
</table>
{{-- Pagination (Optional) --}}
{{-- {!! $products->links() !!} --}}
</div>
</body>
</html>
resources/views/products/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 Baru</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="name" class="form-label">Nama</label>
<input type="text" class="form-control" id="name" name="name" placeholder="Nama Produk">
</div>
<div class="mb-3">
<label for="description" class="form-label">Deskripsi</label>
<textarea class="form-control" id="description" name="description" rows="3"></textarea>
</div>
<div class="mb-3">
<label for="price" class="form-label">Harga</label>
<input type="number" class="form-control" id="price" name="price" placeholder="Harga 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>
resources/views/products/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->name }}
</div>
<div class="mb-3">
<strong>Deskripsi:</strong>
{{ $product->description }}
</div>
<div class="mb-3">
<strong>Harga:</strong>
{{ $product->price }}
</div>
<a class="btn btn-primary" href="{{ route('products.index') }}">Kembali</a>
</div>
</body>
</html>
resources/views/products/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="name" class="form-label">Nama</label>
<input type="text" class="form-control" id="name" name="name" value="{{ $product->name }}" placeholder="Nama Produk">
</div>
<div class="mb-3">
<label for="description" class="form-label">Deskripsi</label>
<textarea class="form-control" id="description" name="description" rows="3">{{ $product->description }}</textarea>
</div>
<div class="mb-3">
<label for="price" class="form-label">Harga</label>
<input type="number" class="form-control" id="price" name="price" value="{{ $product->price }}" placeholder="Harga Produk">
</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>
Perhatikan bahwa kita menggunakan Blade template engine Laravel untuk membuat tampilan. Kita juga menggunakan Bootstrap untuk styling agar tampilan lebih menarik.
6. Uji Coba Aplikasi CRUD Laravel 9
Setelah semua langkah di atas selesai, saatnya menguji aplikasi CRUD yang sudah kita buat. Jalankan server development Laravel menggunakan perintah berikut:
php artisan serve
Buka browser dan akses URL http://localhost:8000/products
. Kamu akan melihat daftar produk (jika ada). Kamu bisa menambahkan produk baru, mengedit produk yang sudah ada, melihat detail produk, dan menghapus produk. Selamat! Kamu telah berhasil membuat CRUD dengan Laravel 9.
7. Validasi Form: Keamanan dan Integritas Data dalam CRUD
Validasi form adalah aspek penting dalam membuat CRUD dengan Laravel 9. Ini memastikan bahwa data yang disimpan ke database valid dan sesuai dengan aturan yang kita tetapkan. Laravel menyediakan fitur validasi yang powerful dan mudah digunakan. Kita sudah menggunakan validasi dasar di method store
dan update
di controller. Kita bisa menambahkan aturan validasi yang lebih kompleks sesuai kebutuhan. Misalnya, kita bisa menambahkan aturan untuk memastikan bahwa harga produk harus positif, atau deskripsi produk tidak boleh terlalu panjang.
Contoh validasi yang lebih kompleks:
public function store(Request $request)
{
$request->validate([
'name' => 'required|max:255',
'description' => 'nullable|max:500',
'price' => 'required|numeric|min:0',
]);
Product::create($request->all());
return redirect()->route('products.index')
->with('success','Produk berhasil ditambahkan.');
}
Pada contoh di atas, kita menambahkan aturan max:255
untuk membatasi panjang nama produk, max:500
untuk membatasi panjang deskripsi produk, dan min:0
untuk memastikan harga produk tidak negatif.
8. Relasi Database: Mengelola Data yang Terhubung (One-to-Many)
Selain operasi CRUD dasar, seringkali kita perlu mengelola relasi antar tabel di database. Misalnya, setiap produk mungkin memiliki beberapa kategori. Kita bisa menggunakan relasi database One-to-Many untuk menghubungkan tabel products
dengan tabel categories
.
Langkah 1: Membuat Model dan Migrasi untuk Category:
php artisan make:model Category -m
Langkah 2: Memodifikasi Migrasi create_categories_table
:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('categories');
}
};
Langkah 3: Menjalankan Migrasi:
php artisan migrate
Langkah 4: Menambahkan Relasi di Model Product.php
:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use AppModelsCategory;
class Product extends Model
{
use HasFactory;
protected $fillable = [
'name',
'description',
'price',
'category_id', // Tambahkan category_id
];
public function category()
{
return $this->belongsTo(Category::class);
}
}
Langkah 5: Menambahkan Relasi di Model Category.php
:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use AppModelsProduct;
class Category extends Model
{
use HasFactory;
protected $fillable = [
'name',
];
public function products()
{
return $this->hasMany(Product::class);
}
}
Langkah 6: Menambahkan category_id
ke Migrasi create_products_table
:
$table->foreignId('category_id')->constrained();
Pastikan untuk menjalankan php artisan migrate:fresh
setelah menambahkan foreign key. Ini akan menghapus semua tabel dan membuatnya kembali dengan foreign key yang baru ditambahkan.
Sekarang, kamu bisa mengakses kategori produk menggunakan $product->category
dan produk-produk dalam kategori menggunakan $category->products
. Kamu perlu memodifikasi form tambah dan edit produk untuk memungkinkan user memilih kategori produk.
9. Authentication dan Authorization: Mengamankan Aplikasi CRUD
Keamanan adalah aspek krusial dalam membuat CRUD dengan Laravel 9. Kita perlu memastikan bahwa hanya user yang berwenang yang bisa mengakses dan memodifikasi data. Laravel menyediakan fitur Authentication dan Authorization yang mudah digunakan.
Authentication: Memastikan bahwa user adalah siapa yang mereka klaim.
Authorization: Menentukan apa yang boleh dilakukan oleh user yang sudah terautentikasi.
Laravel menyediakan package laravel/ui
untuk membantu proses authentication. Instal package tersebut:
composer require laravel/ui
php artisan ui:auth
npm install && npm run dev
Kemudian, jalankan migrasi untuk membuat tabel users:
php artisan migrate
Sekarang kamu bisa mengakses route /login
dan /register
untuk login dan register.
Untuk authorization, kamu bisa menggunakan Policies. Policies adalah class yang menentukan apakah user tertentu berhak melakukan aksi tertentu terhadap model tertentu.
Contoh membuat Policy untuk Product:
php artisan make:policy ProductPolicy --model=Product
Buka file app/Policies/ProductPolicy.php
. Tambahkan logika authorization di method-method seperti view
, create
, update
, dan delete
.
Setelah membuat Policy, daftarkan Policy tersebut di app/Providers/AuthServiceProvider.php
.
Kemudian, kamu bisa menggunakan method authorize
di controller untuk mengecek apakah user berhak melakukan aksi tertentu:
public function update(Request $request, Product $product)
{
$this->authorize('update', $product);
// ... logika update ...
}
10. Testing: Memastikan Kualitas Kode dan Fungsionalitas CRUD
Testing adalah bagian penting dari pengembangan perangkat lunak. Dengan testing, kita bisa memastikan bahwa kode yang kita tulis berfungsi dengan benar dan tidak ada bug. Laravel menyediakan framework testing yang powerful dan mudah digunakan.
Kita bisa membuat unit test untuk menguji model, controller, dan route. Kita juga bisa membuat feature test untuk menguji fungsionalitas aplikasi secara keseluruhan.
Contoh membuat unit test untuk model Product:
php artisan make:test ProductModelTest --unit
Buka file tests/Unit/ProductModelTest.php
. Tambahkan test untuk menguji method-method di model Product.
Contoh membuat feature test untuk controller Product:
php artisan make:test ProductControllerTest
Buka file tests/Feature/ProductControllerTest.php
. Tambahkan test untuk menguji method-method di controller Product.
Jalankan semua test menggunakan perintah:
php artisan test
11. Debugging: Mengatasi Error dan Masalah dalam Aplikasi CRUD
Debugging adalah proses mencari dan memperbaiki error dan masalah dalam aplikasi. Laravel menyediakan beberapa tools dan teknik debugging yang berguna:
- Error Logging: Laravel secara otomatis mencatat error ke file log. Kamu bisa melihat file log untuk mencari tahu apa yang salah.
- Debugbar: Package Debugbar menyediakan informasi debugging yang berguna, seperti query database, request, dan session. Instal Debugbar menggunakan Composer:
composer require barryvdh/laravel-debugbar --dev
- dd() Function: Fungsi
dd()
(dump and die) digunakan untuk menampilkan nilai variabel dan menghentikan eksekusi kode. - Xdebug: Xdebug adalah extension PHP yang menyediakan fitur debugging yang lebih canggih, seperti stepping through code dan setting breakpoints.
Dengan menggunakan tools dan teknik debugging ini, kamu bisa dengan mudah mencari dan memperbaiki error dalam aplikasi CRUD kamu.
12. Optimalisasi: Meningkatkan Performa Aplikasi CRUD Laravel
Setelah aplikasi CRUD selesai dibuat dan diuji, langkah selanjutnya adalah melakukan optimalisasi untuk meningkatkan performa aplikasi. Berikut adalah beberapa tips optimalisasi:
- Caching: Gunakan caching untuk menyimpan data yang sering diakses. Laravel menyediakan berbagai jenis caching, seperti file cache, database cache, dan Redis cache.
- Eager Loading: Gunakan eager loading untuk mengurangi jumlah query database saat mengambil relasi.
- Query Optimization: Optimalkan query database untuk mengurangi waktu eksekusi. Gunakan indexing dan hindari query yang kompleks.
- Code Optimization: Optimalkan kode PHP untuk mengurangi penggunaan memory dan CPU. Hindari loop yang tidak perlu dan gunakan fungsi-fungsi built-in yang efisien.
- CDN: Gunakan CDN (Content Delivery Network) untuk menyajikan file-file statis, seperti gambar dan CSS.
Dengan menerapkan tips optimalisasi ini, kamu bisa meningkatkan performa aplikasi CRUD Laravel kamu secara signifikan.
Dengan panduan lengkap ini, kamu sekarang memiliki pemahaman yang solid tentang cara membuat CRUD dengan Laravel 9. Ingatlah untuk selalu praktik dan bereksperimen dengan fitur-fitur Laravel lainnya untuk meningkatkan kemampuan pengembangan web kamu. Selamat mencoba!