Laravel 9, framework PHP yang populer dan tangguh, sangat ideal untuk membangun aplikasi web modern. Salah satu fondasi utama dari banyak aplikasi web adalah operasi CRUD (Create, Read, Update, Delete). Dalam panduan lengkap ini, kita akan mempelajari cara membuat CRUD dengan Laravel 9 langkah demi langkah, lengkap dengan contoh kode yang mudah diikuti. Siapkan kopi Anda dan mari kita mulai!
1. Persiapan Awal: Instalasi Laravel 9 dan Konfigurasi Database
Sebelum kita terjun ke pembuatan CRUD, kita perlu memastikan Laravel 9 sudah terinstal dan terkonfigurasi dengan benar. Jika Anda belum melakukannya, ikuti langkah-langkah berikut:
Instalasi Laravel 9:
Buka terminal atau command prompt Anda dan jalankan perintah berikut:
composer create-project laravel/laravel:^9.0 nama-proyek-crud
cd nama-proyek-crud
Ganti nama-proyek-crud
dengan nama proyek yang Anda inginkan. Perintah ini akan mengunduh dan menginstal Laravel 9 ke direktori baru yang bernama nama-proyek-crud
.
Konfigurasi Database:
Laravel memerlukan koneksi ke database untuk menyimpan dan mengambil data. Buka file .env
yang berada di direktori proyek Anda. Cari baris berikut dan sesuaikan dengan pengaturan database Anda:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=nama_pengguna
DB_PASSWORD=kata_sandi
DB_CONNECTION
: Jenis database yang akan digunakan (contoh: mysql, pgsql, sqlite).DB_HOST
: Alamat server database (biasanya localhost atau 127.0.0.1).DB_PORT
: Port yang digunakan oleh database server (biasanya 3306 untuk MySQL).DB_DATABASE
: Nama database yang akan Anda gunakan untuk proyek ini.DB_USERNAME
: Nama pengguna untuk mengakses database.DB_PASSWORD
: Kata sandi untuk mengakses database.
Pastikan database yang Anda tentukan (nama_database
) sudah dibuat di server database Anda.
Migrasi Database:
Setelah konfigurasi database selesai, kita perlu menjalankan migrasi untuk membuat tabel-tabel yang diperlukan. Jalankan perintah berikut di terminal:
php artisan migrate
Perintah ini akan menjalankan migrasi yang sudah ada di direktori database/migrations
. Secara default, Laravel menyertakan migrasi untuk tabel users
dan password_resets
.
2. Membuat Model dan Migrasi untuk Tabel Kita: Studi Kasus “Produk”
Sekarang mari kita buat model dan migrasi untuk tabel yang akan kita gunakan untuk operasi CRUD. Dalam contoh ini, kita akan menggunakan studi kasus “Produk”. Kita akan membuat tabel products
dengan kolom-kolom seperti name
, description
, dan price
.
Gunakan perintah berikut untuk membuat model dan migrasi secara bersamaan:
php artisan make:model Product -m
Perintah ini akan membuat dua file:
app/Models/Product.php
: File model untuk tabelproducts
.database/migrations/YYYY_MM_DD_HHMMSS_create_products_table.php
: File migrasi untuk membuat tabelproducts
.
Buka file migrasi (database/migrations/YYYY_MM_DD_HHMMSS_create_products_table.php
) dan modifikasi up()
function seperti berikut:
<?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 ini mendefinisikan struktur tabel products
dengan kolom id
(primary key auto-increment), name
(string), description
(text, boleh kosong), price
(decimal dengan 10 digit total dan 2 digit desimal), dan timestamps
(created_at dan updated_at).
Setelah selesai memodifikasi file migrasi, jalankan kembali perintah migrasi:
php artisan migrate
Ini akan membuat tabel products
di database Anda.
3. Membuat Controller untuk Menangani Logika CRUD: ProductController
Controller adalah bagian penting dalam Laravel yang menangani logika aplikasi. Kita akan membuat sebuah controller bernama ProductController
untuk menangani operasi CRUD untuk tabel products
.
Gunakan perintah berikut untuk membuat controller:
php artisan make:controller ProductController
Ini akan membuat file app/Http/Controllers/ProductController.php
.
Buka file app/Http/Controllers/ProductController.php
dan tambahkan kode berikut:
<?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',
'price' => 'required|numeric',
]);
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',
'price' => 'required|numeric',
]);
$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 ini mendefinisikan berbagai metode untuk menangani operasi CRUD:
index()
: Menampilkan daftar semua produk.create()
: Menampilkan form untuk membuat produk baru.store()
: Menyimpan produk baru ke database.show()
: Menampilkan detail produk tertentu.edit()
: Menampilkan form untuk mengedit produk.update()
: Memperbarui produk di database.destroy()
: Menghapus produk dari database.
Perhatikan bahwa setiap metode mereturn sebuah view
. Kita akan membuat view ini di bagian selanjutnya. Juga perhatikan validasi data yang dilakukan menggunakan $request->validate()
.
4. Membuat View untuk Menampilkan Data dan Form: Blade Templates
View di Laravel menggunakan template Blade yang memudahkan untuk menghasilkan HTML dinamis. Kita perlu membuat view untuk setiap operasi CRUD. Buat direktori resources/views/products
dan buat file-file berikut di dalamnya:
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 kode untuk setiap file view:
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">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Daftar Produk</h2>
</div>
<div class="pull-right">
<a class="btn btn-success" href="{{ route('products.create') }}"> Buat Produk Baru</a>
</div>
</div>
</div>
@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) }}">Tampilkan</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>
resources/views/products/create.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Buat Produk Baru</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Buat Produk Baru</h2>
</div>
<div class="pull-right">
<a class="btn btn-primary" href="{{ route('products.index') }}"> Kembali</a>
</div>
</div>
</div>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<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="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Nama:</strong>
<input type="text" name="name" class="form-control" placeholder="Nama">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Deskripsi:</strong>
<textarea class="form-control" style="height:150px" name="description" placeholder="Deskripsi"></textarea>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Harga:</strong>
<input type="number" step="0.01" name="price" class="form-control" placeholder="Harga">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12 text-center">
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</div>
</form>
</div>
</body>
</html>
resources/views/products/show.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Tampilkan Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Tampilkan Produk</h2>
</div>
<div class="pull-right">
<a class="btn btn-primary" href="{{ route('products.index') }}"> Kembali</a>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Nama:</strong>
{{ $product->name }}
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Deskripsi:</strong>
{{ $product->description }}
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Harga:</strong>
{{ $product->price }}
</div>
</div>
</div>
</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">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Edit Produk</h2>
</div>
<div class="pull-right">
<a class="btn btn-primary" href="{{ route('products.index') }}"> Kembali</a>
</div>
</div>
</div>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<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="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Nama:</strong>
<input type="text" name="name" value="{{ $product->name }}" class="form-control" placeholder="Nama">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Deskripsi:</strong>
<textarea class="form-control" style="height:150px" name="description" placeholder="Deskripsi">{{ $product->description }}</textarea>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Harga:</strong>
<input type="number" step="0.01" name="price" value="{{ $product->price }}" class="form-control" placeholder="Harga">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12 text-center">
<button type="submit" class="btn btn-primary">Update</button>
</div>
</div>
</form>
</div>
</body>
</html>
Pastikan Anda telah menginstal Bootstrap untuk tampilan yang lebih baik. Anda bisa menambahkan link CDN Bootstrap di <head>
setiap file Blade.
5. Mendefinisikan Route untuk Mengakses Controller: web.php
Setelah membuat controller dan view, kita perlu mendefinisikan route untuk menghubungkan URL ke metode controller yang sesuai. Buka file routes/web.php
dan tambahkan kode 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::get('/', function () {
return view('welcome');
});
Route::resource('products', ProductController::class);
Kode ini menggunakan Route::resource()
untuk mendefinisikan semua route yang diperlukan untuk operasi CRUD pada resource products
. Ini secara otomatis membuat route untuk index
, create
, store
, show
, edit
, update
, dan destroy
.
6. Menguji Aplikasi CRUD Anda: Jalankan Server dan Akses URL
Sekarang, kita siap menguji aplikasi CRUD kita. Jalankan server development Laravel dengan perintah berikut:
php artisan serve
Ini akan menjalankan server di http://127.0.0.1:8000
.
Buka browser Anda dan akses URL http://127.0.0.1:8000/products
. Anda seharusnya melihat daftar produk (saat ini kosong).
Anda dapat menggunakan tombol “Buat Produk Baru” untuk menambahkan produk baru. Anda juga dapat mengedit dan menghapus produk yang sudah ada.
Selamat! Anda telah berhasil membuat CRUD dengan Laravel 9.
7. Tips dan Trik Lanjutan untuk Pengembangan CRUD yang Lebih Baik
Berikut adalah beberapa tips dan trik untuk meningkatkan pengembangan CRUD Anda:
- Validasi Data Lebih Lanjut: Gunakan validasi data yang lebih canggih untuk memastikan data yang disimpan di database valid dan konsisten. Anda dapat menggunakan aturan validasi bawaan Laravel atau membuat aturan validasi khusus.
- Otorisasi: Implementasikan otorisasi untuk mengontrol siapa yang dapat mengakses dan memodifikasi data. Laravel menyediakan sistem otorisasi yang kuat yang dapat Anda gunakan.
- Pagination: Jika Anda memiliki banyak data, gunakan pagination untuk memecah data menjadi halaman-halaman yang lebih kecil. Laravel menyediakan fitur pagination yang mudah digunakan. Contoh pagination sudah ada di view
index.blade.php
. - Search: Tambahkan fitur pencarian untuk memudahkan pengguna mencari data.
- Relationships: Manfaatkan fitur relationships di Eloquent ORM untuk membuat hubungan antara tabel-tabel di database Anda. Ini akan memudahkan Anda untuk mengambil dan memanipulasi data terkait.
- Refactoring: Secara berkala, refactoring kode Anda untuk membuatnya lebih mudah dibaca, dipelihara, dan diuji.
- Testing: Tulis unit test dan feature test untuk memastikan aplikasi CRUD Anda berfungsi dengan benar.
8. Menggunakan Resource Controllers dan Form Requests untuk Kode yang Lebih Bersih
Laravel menyediakan Resource Controllers dan Form Requests yang dapat membantu Anda menulis kode CRUD yang lebih bersih dan terstruktur. Kita sudah menggunakan Resource Controllers, mari kita lihat Form Requests.
Form Requests:
Form Requests memungkinkan Anda memindahkan logika validasi data dari controller ke kelas terpisah. Ini membuat controller Anda lebih ringkas dan mudah dibaca.
Untuk membuat Form Request, gunakan perintah berikut:
php artisan make:request StoreProductRequest
Ini akan membuat file app/Http/Requests/StoreProductRequest.php
.
Buka file app/Http/Requests/StoreProductRequest.php
dan modifikasi authorize()
dan rules()
methods seperti berikut:
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
class StoreProductRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; // Ubah ke false jika Anda ingin menerapkan otorisasi di sini
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'name' => 'required|max:255',
'description' => 'nullable',
'price' => 'required|numeric|min:0',
];
}
}
authorize()
: Menentukan apakah pengguna berwenang untuk membuat permintaan ini. Secara default, diatur ketrue
.rules()
: Mendefinisikan aturan validasi untuk setiap field.
Kemudian, modifikasi store()
method di ProductController
untuk menggunakan StoreProductRequest
:
public function store(StoreProductRequest $request)
{
Product::create($request->validated());
return redirect()->route('products.index')
->with('success','Product created successfully.');
}
Perhatikan bahwa kita mengganti $request->all()
dengan $request->validated()
. Ini hanya akan mengambil field yang lolos validasi.
Anda juga dapat membuat Form Request untuk update (UpdateProductRequest
) dan menggunakannya di update()
method.
9. Mengamankan Aplikasi CRUD Anda: Pentingnya Keamanan Web
Keamanan adalah aspek penting dalam pengembangan web. Pastikan aplikasi CRUD Anda aman dari berbagai serangan web, seperti:
- Cross-Site Scripting (XSS): Cegah XSS dengan melakukan sanitasi input pengguna dan menggunakan escaping saat menampilkan data.
- Cross-Site Request Forgery (CSRF): Laravel menyediakan perlindungan CSRF bawaan. Pastikan Anda menggunakan
@csrf
directive di form Anda. - SQL Injection: Gunakan Eloquent ORM untuk mencegah SQL injection. Eloquent secara otomatis melakukan escaping pada data yang dimasukkan ke database.
- Mass Assignment: Lindungi model Anda dari mass assignment dengan mendefinisikan properti
$fillable
atau$guarded
di model Anda. Ini menentukan field mana yang dapat diisi secara massal. - Otorisasi: Terapkan otorisasi untuk mengontrol akses ke sumber daya dan data.
10. Kesimpulan: Membuat CRUD dengan Laravel 9 itu Mudah!
Dalam panduan lengkap ini, kita telah mempelajari cara membuat CRUD dengan Laravel 9 langkah demi langkah. Kita telah membahas instalasi Laravel 9, konfigurasi database, pembuatan model dan migrasi, pembuatan controller, pembuatan view, pendefinisian route, dan pengujian aplikasi. Kita juga telah membahas tips dan trik lanjutan untuk pengembangan CRUD yang lebih baik, serta pentingnya keamanan web.
Dengan mengikuti panduan ini, Anda seharusnya dapat membuat aplikasi CRUD yang fungsional dan aman dengan Laravel 9. Teruslah berlatih dan bereksperimen untuk meningkatkan keterampilan pengembangan web Anda. Selamat mencoba! Jangan ragu untuk mencari tutorial atau dokumentasi Laravel resmi untuk informasi lebih lanjut.