Laravel 9 adalah framework PHP yang populer di kalangan developer web karena kemudahan dan fleksibilitasnya. Salah satu tugas paling mendasar dalam pengembangan web adalah membuat CRUD (Create, Read, Update, Delete). Dalam artikel ini, kita akan membahas cara membuat CRUD dengan Laravel 9 secara praktis dan mudah dipahami, langkah demi langkah. Jadi, siap untuk memulai? Ayo kita mulai!
1. Persiapan Awal: Instalasi Laravel 9 dan Konfigurasi Database
Sebelum kita masuk ke pembuatan CRUD, pastikan kamu sudah memiliki lingkungan pengembangan yang siap. Ini termasuk PHP (minimal versi 8.0), Composer, dan database (misalnya MySQL, PostgreSQL, atau SQLite).
Instalasi Laravel 9:
Buka terminal atau command prompt kamu dan jalankan perintah berikut:
composer create-project laravel/laravel:^9.0 nama_proyek
cd nama_proyek
Ganti nama_proyek dengan nama proyek yang kamu inginkan. Perintah ini akan membuat proyek Laravel 9 baru di direktori tersebut.
Konfigurasi Database:
Setelah instalasi selesai, buka file .env di root proyek kamu. Cari bagian yang berkaitan dengan konfigurasi database dan sesuaikan dengan detail database kamu. Contoh konfigurasi untuk MySQL:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=nama_pengguna
DB_PASSWORD=kata_sandi
Pastikan untuk mengganti nama_database, nama_pengguna, dan kata_sandi dengan kredensial yang benar.
Memastikan Aplikasi Berjalan:
Untuk memastikan aplikasi Laravel kamu berjalan dengan baik, jalankan perintah berikut di terminal:
php artisan serve
Buka browser kamu dan kunjungi http://127.0.0.1:8000. Jika kamu melihat halaman selamat datang Laravel, berarti instalasi dan konfigurasi berhasil!
2. Membuat Model dan Migrasi Database: Mendesain Struktur Data
Langkah selanjutnya dalam cara membuat CRUD dengan Laravel 9 adalah mendefinisikan struktur data yang akan kita kelola. Kita akan membuat model dan migrasi database untuk ini. Anggap saja kita ingin membuat CRUD untuk mengelola data “Produk”.
Membuat Model dan Migrasi:
Gunakan Artisan CLI untuk membuat model dan migrasi secara bersamaan:
php artisan make:model Product -m
Perintah ini akan membuat dua file: app/Models/Product.php (model Product) dan database/migrations/xxxx_xx_xx_xxxxxx_create_products_table.php (migrasi untuk tabel products).
Mendefinisikan Struktur Tabel:
Buka file migrasi yang baru dibuat dan tambahkan kolom-kolom yang dibutuhkan untuk tabel products. 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->integer('stock');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('products');
}
};
Pada kode di atas, kita mendefinisikan kolom name (nama produk), description (deskripsi produk), price (harga produk), dan stock (stok produk). timestamps() akan secara otomatis menambahkan kolom created_at dan updated_at.
Menjalankan Migrasi:
Setelah mendefinisikan struktur tabel, jalankan migrasi untuk membuat tabel di database kamu:
php artisan migrate
Jika tidak ada error, tabel products akan berhasil dibuat di database kamu.
3. Membuat Controller: Mengatur Logika Aplikasi CRUD
Controller berfungsi sebagai jembatan antara model dan view. Di sinilah logika aplikasi CRUD akan diimplementasikan.
Membuat Controller:
Gunakan Artisan CLI untuk membuat controller:
php artisan make:controller ProductController
Perintah ini akan membuat file app/Http/Controllers/ProductController.php.
Implementasi Metode CRUD dalam Controller:
Buka file ProductController.php dan tambahkan metode-metode CRUD: index, create, store, show, edit, update, dan destroy.
<?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([
'name' => 'required',
'description' => 'nullable',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
]);
Product::create($request->all());
return redirect()->route('products.index')
->with('success','Product created successfully.');
}
/**
* 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([
'name' => 'required',
'description' => 'nullable',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
]);
$product->update($request->all());
return redirect()->route('products.index')
->with('success','Product updated successfully');
}
/**
* 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','Product deleted successfully');
}
}
Kode di atas menunjukkan implementasi dasar dari metode CRUD. Perhatikan bahwa kita menggunakan validasi untuk memastikan data yang disimpan valid. Kita juga menggunakan redirect() untuk mengarahkan pengguna kembali ke halaman index setelah operasi selesai.
4. Membuat View: Menampilkan Data ke Pengguna
View adalah tampilan yang dilihat pengguna. Kita akan membuat view untuk menampilkan daftar produk, form untuk menambah produk baru, form untuk mengedit produk, dan halaman detail produk.
Membuat Direktori View:
Buat direktori resources/views/products untuk menyimpan file-file view.
Membuat File View:
Buat file-file view berikut di dalam direktori resources/views/products:
index.blade.php: Menampilkan daftar produk.create.blade.php: Form untuk menambah produk baru.edit.blade.php: Form untuk mengedit produk.show.blade.php: Menampilkan detail produk.
Contoh index.blade.php:
<!DOCTYPE html>
<html>
<head>
<title>Products</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
@if ($message = Session::get('success'))
<div class="alert alert-success">
<p>{{ $message }}</p>
</div>
@endif
<h1>Daftar Produk</h1>
<a href="{{ route('products.create') }}" class="btn btn-success mb-3">Tambah Produk Baru</a>
<table class="table table-bordered">
<thead>
<tr>
<th>No</th>
<th>Nama</th>
<th>Deskripsi</th>
<th>Harga</th>
<th>Stok</th>
<th width="280px">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($products as $product)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $product->name }}</td>
<td>{{ $product->description }}</td>
<td>{{ $product->price }}</td>
<td>{{ $product->stock }}</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
</tbody>
</table>
</div>
</body>
</html>
Kode di atas adalah contoh sederhana dari index.blade.php. Kode ini menampilkan daftar produk dalam bentuk tabel. Kode ini juga menyertakan link untuk melihat detail produk, mengedit produk, dan menghapus produk.
Membuat File View Lainnya:
Buat file create.blade.php, edit.blade.php, dan show.blade.php dengan struktur yang sesuai. Pastikan untuk menggunakan form HTML untuk memasukkan data produk pada create.blade.php dan edit.blade.php.
5. Mendefinisikan Route: Menghubungkan URL dengan Controller
Route adalah pemetaan antara URL dan controller. Kita perlu mendefinisikan route untuk setiap metode CRUD yang telah kita buat di controller.
Mendefinisikan Route:
Buka file routes/web.php dan tambahkan route berikut:
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersProductController;
/*
|--------------------------------------------------------------------------
| 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);
Baris Route::resource('products', ProductController::class); secara otomatis membuat route untuk semua metode CRUD di ProductController. Ini adalah cara yang paling efisien untuk mendefinisikan route CRUD.
6. Menguji Aplikasi CRUD: Verifikasi Fungsionalitas
Setelah semua langkah di atas selesai, saatnya untuk menguji aplikasi CRUD kamu. Buka browser kamu dan kunjungi URL berikut:
http://127.0.0.1:8000/products: Menampilkan daftar produk.http://127.0.0.1:8000/products/create: Menampilkan form untuk menambah produk baru.http://127.0.0.1:8000/products/{id}: Menampilkan detail produk (ganti{id}dengan ID produk).http://127.0.0.1:8000/products/{id}/edit: Menampilkan form untuk mengedit produk (ganti{id}dengan ID produk).
Pastikan semua fungsi CRUD (Create, Read, Update, Delete) berjalan dengan baik. Periksa apakah data berhasil disimpan, ditampilkan, diubah, dan dihapus dari database.
7. Validasi Data: Meningkatkan Keamanan dan Integritas
Validasi data sangat penting untuk memastikan data yang disimpan ke database valid dan konsisten. Laravel menyediakan fitur validasi yang mudah digunakan.
Implementasi Validasi:
Kita sudah mengimplementasikan validasi pada metode store dan update di ProductController.php di atas. Perhatikan kode berikut:
$request->validate([
'name' => 'required',
'description' => 'nullable',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
]);
Kode ini menentukan aturan validasi untuk setiap field. Misalnya, name harus diisi (required), price harus berupa angka (numeric) dan minimal 0, dan stock harus berupa integer dan minimal 0. Jika validasi gagal, Laravel akan secara otomatis mengarahkan pengguna kembali ke halaman sebelumnya dan menampilkan pesan error.
Menampilkan Pesan Error Validasi:
Untuk menampilkan pesan error validasi di view, kamu bisa menggunakan kode berikut:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
Kode ini akan menampilkan pesan error jika ada error validasi.
8. Implementasi Pagination: Menangani Data dalam Jumlah Besar
Ketika data yang dikelola semakin banyak, menampilkan semua data sekaligus akan membuat halaman menjadi lambat dan sulit dinavigasi. Implementasi pagination (penomoran halaman) adalah solusi yang tepat.
Implementasi Pagination:
Ubah metode index di ProductController.php menjadi berikut:
public function index()
{
$products = Product::paginate(10); // Menampilkan 10 produk per halaman
return view('products.index', compact('products'))
->with('i', (request()->input('page', 1) - 1) * 10); //Untuk menampilkan nomor urut yang benar di pagination
}
Pada kode di atas, kita menggunakan metode paginate(10) untuk membagi data menjadi halaman-halaman dengan 10 produk per halaman.
Menampilkan Link Pagination di View:
Tambahkan kode berikut di index.blade.php untuk menampilkan link pagination:
{!! $products->links() !!}
Kode ini akan menampilkan link untuk berpindah antar halaman.
9. Fitur Pencarian: Mempermudah Pencarian Data
Fitur pencarian akan sangat membantu pengguna dalam menemukan data yang mereka cari dengan cepat.
Implementasi Fitur Pencarian:
Tambahkan form pencarian di index.blade.php:
<form action="{{ route('products.index') }}" method="GET">
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Cari produk..." name="search">
<button class="btn btn-outline-secondary" type="submit">Cari</button>
</div>
</form>
Ubah metode index di ProductController.php menjadi berikut:
public function index(Request $request)
{
$search = $request->get('search');
$products = Product::when($search, function ($query, $search) {
return $query->where('name', 'like', "%{$search}%")
->orWhere('description', 'like', "%{$search}%");
})->paginate(10);
return view('products.index', compact('products'))
->with('i', (request()->input('page', 1) - 1) * 10);
}
Kode di atas akan mencari produk berdasarkan nama atau deskripsi.
10. Keamanan Aplikasi CRUD: Melindungi Data dari Ancaman
Keamanan adalah aspek penting dalam pengembangan aplikasi web. Pastikan aplikasi CRUD kamu aman dari ancaman seperti SQL injection, cross-site scripting (XSS), dan cross-site request forgery (CSRF).
Mencegah SQL Injection:
Laravel secara otomatis melindungi aplikasi kamu dari SQL injection dengan menggunakan Eloquent ORM. Hindari menggunakan raw queries jika memungkinkan.
Mencegah XSS:
Gunakan Blade templating engine Laravel yang secara otomatis melakukan escaping pada data yang ditampilkan di view. Ini akan mencegah XSS.
Mencegah CSRF:
Laravel menyediakan middleware CSRF yang melindungi aplikasi kamu dari serangan CSRF. Pastikan untuk menyertakan token CSRF pada setiap form yang mengirimkan data ke server.
@csrf
11. Penerapan Resource Controller: Cara Lebih Ringkas
Laravel menyediakan fitur Resource Controller yang memudahkan pembuatan CRUD dengan struktur kode yang lebih ringkas. Kita sudah menggunakan ini di awal. Resource Controller secara otomatis menyediakan route dan controller method yang dibutuhkan untuk operasi CRUD.
Keuntungan Resource Controller:
- Kode lebih terstruktur dan mudah dibaca.
- Mengurangi boilerplate code.
- Mempercepat proses development.
12. Debugging dan Troubleshooting: Mengatasi Masalah dalam Pembuatan CRUD
Meskipun mengikuti panduan ini dengan seksama, mungkin saja kamu akan menemui masalah. Berikut beberapa tips untuk debugging dan troubleshooting:
- Periksa Log File: Laravel mencatat error ke dalam log file yang terletak di
storage/logs/laravel.log. Periksa file ini untuk melihat pesan error yang lebih detail. - Gunakan Debugging Tools: Gunakan tools seperti Xdebug untuk melakukan debugging step-by-step.
- Manfaatkan Laravel Debugbar: Install package
barryvdh/laravel-debugbaruntuk menampilkan informasi debugging di browser. - Periksa Konfigurasi: Pastikan konfigurasi database dan file
.envsudah benar. - Cari Solusi Online: Google dan Stack Overflow adalah sumber daya yang sangat baik untuk mencari solusi atas masalah yang kamu hadapi.
Dengan panduan lengkap ini, kamu sekarang memiliki pemahaman yang kuat tentang cara membuat CRUD dengan Laravel 9. Ingatlah untuk selalu memprioritaskan keamanan dan validasi data. Selamat mencoba dan semoga sukses!









