Laravel, framework PHP yang populer ini, dikenal karena sintaksnya yang elegan dan fitur-fiturnya yang memudahkan pengembangan web. Salah satu tugas paling umum dalam pengembangan web adalah membuat CRUD (Create, Read, Update, Delete). Artikel ini akan membahas cara membuat CRUD sederhana dengan Laravel versi Indonesia, langkah demi langkah, sehingga Anda dapat memahami dasar-dasarnya dan mengaplikasikannya pada proyek Anda. Mari kita mulai!
1. Apa itu CRUD dan Mengapa Penting dalam Laravel?
Sebelum membahas cara membuat CRUD sederhana di Laravel, mari kita pahami dulu apa itu CRUD dan mengapa ia begitu penting. CRUD adalah singkatan dari:
- Create: Membuat data baru.
- Read: Membaca atau menampilkan data yang sudah ada.
- Update: Memperbarui data yang sudah ada.
- Delete: Menghapus data.
CRUD adalah operasi dasar yang dilakukan pada sebagian besar aplikasi web. Hampir setiap aplikasi yang Anda gunakan, dari media sosial hingga e-commerce, bergantung pada operasi CRUD untuk mengelola data. Dalam konteks Laravel, memahami cara membuat CRUD sederhana sangat penting karena:
- Efisiensi: Laravel menyediakan alat dan fitur yang mempermudah implementasi CRUD.
- Keamanan: Laravel memiliki fitur keamanan bawaan yang melindungi aplikasi Anda dari kerentanan umum.
- Skalabilitas: Laravel memungkinkan Anda membangun aplikasi yang dapat berkembang seiring pertumbuhan bisnis Anda.
- Standarisasi: Menggunakan Laravel untuk CRUD membantu Anda mengikuti praktik terbaik dalam pengembangan web.
2. Persiapan Awal: Instalasi Laravel dan Konfigurasi Database
Sebelum kita mulai membuat CRUD sederhana dengan Laravel, ada beberapa persiapan yang perlu dilakukan.
a. Instalasi Laravel:
Jika Anda belum menginstal Laravel, ikuti langkah-langkah berikut:
-
Pastikan Anda sudah menginstal PHP (minimal versi 7.3) dan Composer. Composer adalah pengelola paket untuk PHP.
-
Buka terminal atau command prompt Anda.
-
Jalankan perintah berikut untuk membuat proyek Laravel baru:
composer create-project --prefer-dist laravel/laravel nama-proyekGanti
nama-proyekdengan nama yang Anda inginkan untuk proyek Anda. -
Setelah proses instalasi selesai, masuk ke direktori proyek Anda:
cd nama-proyek
b. Konfigurasi Database:
-
Buat database baru di server database Anda (misalnya, MySQL, PostgreSQL, atau SQLite).
-
Buka file
.envdi direktori proyek Anda. -
Cari variabel-variabel yang berkaitan dengan database dan ubah nilainya sesuai dengan konfigurasi database Anda. Contoh:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=nama_pengguna DB_PASSWORD=kata_sandiPastikan untuk mengganti
nama_database,nama_pengguna, dankata_sandidengan informasi yang sesuai.
c. Menjalankan Migrasi Awal:
Laravel sudah menyediakan migrasi default untuk tabel users. Jalankan migrasi ini untuk membuat tabel users di database Anda:
php artisan migrate
3. Membuat Model dan Migrasi untuk Data yang Akan Dikelola (Contoh: Artikel)
Sekarang, mari kita buat model dan migrasi untuk data yang akan kita kelola dengan CRUD. Dalam contoh ini, kita akan menggunakan “Artikel” sebagai contoh.
a. Membuat Model:
Jalankan perintah berikut untuk membuat model Artikel:
php artisan make:model Artikel -m
Perintah ini akan membuat dua file:
app/Models/Artikel.php: File modelArtikel.database/migrations/[tanggal_pembuatan]_create_artikels_table.php: File migrasi untuk tabelartikels. Opsi-mpada perintah di atas akan secara otomatis membuat file migrasi.
b. Modifikasi Migrasi:
Buka file migrasi database/migrations/[tanggal_pembuatan]_create_artikels_table.php. Di dalam method up(), tambahkan kolom-kolom yang Anda inginkan untuk tabel artikels. Contoh:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
class CreateArtikelsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('artikels', function (Blueprint $table) {
$table->id();
$table->string('judul');
$table->text('isi');
$table->string('penulis');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('artikels');
}
}
Dalam contoh ini, kita menambahkan kolom judul, isi, dan penulis ke tabel artikels.
c. Menjalankan Migrasi:
Setelah Anda memodifikasi file migrasi, jalankan migrasi untuk membuat tabel artikels di database Anda:
php artisan migrate
d. Mendefinisikan Fillable Attributes pada Model:
Buka file model app/Models/Artikel.php. Tambahkan properti $fillable untuk menentukan atribut mana yang dapat diisi secara massal (mass assignment). Ini penting untuk keamanan. Contoh:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Artikel extends Model
{
use HasFactory;
protected $fillable = [
'judul',
'isi',
'penulis',
];
}
4. Membuat Controller untuk Mengelola Operasi CRUD
Langkah selanjutnya dalam membuat CRUD sederhana adalah membuat controller. Controller bertugas menangani permintaan dari pengguna dan berinteraksi dengan model untuk melakukan operasi CRUD.
a. Membuat Controller:
Jalankan perintah berikut untuk membuat controller ArtikelController:
php artisan make:controller ArtikelController --resource
Opsi --resource akan membuat controller dengan method-method dasar untuk CRUD (index, create, store, show, edit, update, destroy).
b. Implementasi Method CRUD dalam Controller:
Buka file app/Http/Controllers/ArtikelController.php. Implementasikan method-method CRUD berikut:
index(): Menampilkan daftar artikel.create(): Menampilkan form untuk membuat artikel baru.store(): Menyimpan artikel baru ke database.show(): Menampilkan detail artikel.edit(): Menampilkan form untuk mengedit artikel.update(): Memperbarui artikel di database.destroy(): Menghapus artikel dari database.
Berikut contoh implementasi:
<?php
namespace AppHttpControllers;
use AppModelsArtikel;
use IlluminateHttpRequest;
class ArtikelController extends Controller
{
/**
* Display a listing of the resource.
*
* @return IlluminateHttpResponse
*/
public function index()
{
$artikels = Artikel::all();
return view('artikels.index', compact('artikels'));
}
/**
* Show the form for creating a new resource.
*
* @return IlluminateHttpResponse
*/
public function create()
{
return view('artikels.create');
}
/**
* Store a newly created resource in storage.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
*/
public function store(Request $request)
{
$request->validate([
'judul' => 'required',
'isi' => 'required',
'penulis' => 'required',
]);
Artikel::create($request->all());
return redirect()->route('artikels.index')
->with('success', 'Artikel berhasil ditambahkan.');
}
/**
* Display the specified resource.
*
* @param AppModelsArtikel $artikel
* @return IlluminateHttpResponse
*/
public function show(Artikel $artikel)
{
return view('artikels.show', compact('artikel'));
}
/**
* Show the form for editing the specified resource.
*
* @param AppModelsArtikel $artikel
* @return IlluminateHttpResponse
*/
public function edit(Artikel $artikel)
{
return view('artikels.edit', compact('artikel'));
}
/**
* Update the specified resource in storage.
*
* @param IlluminateHttpRequest $request
* @param AppModelsArtikel $artikel
* @return IlluminateHttpResponse
*/
public function update(Request $request, Artikel $artikel)
{
$request->validate([
'judul' => 'required',
'isi' => 'required',
'penulis' => 'required',
]);
$artikel->update($request->all());
return redirect()->route('artikels.index')
->with('success', 'Artikel berhasil diperbarui.');
}
/**
* Remove the specified resource from storage.
*
* @param AppModelsArtikel $artikel
* @return IlluminateHttpResponse
*/
public function destroy(Artikel $artikel)
{
$artikel->delete();
return redirect()->route('artikels.index')
->with('success', 'Artikel berhasil dihapus.');
}
}
5. Membuat View untuk Menampilkan Data dan Form
Setelah controller selesai, kita perlu membuat view untuk menampilkan data dan form kepada pengguna.
a. Membuat Direktori View:
Buat direktori artikels di dalam direktori resources/views. Di dalam direktori artikels, buat file-file berikut:
index.blade.php: Menampilkan daftar artikel.create.blade.php: Menampilkan form untuk membuat artikel baru.show.blade.php: Menampilkan detail artikel.edit.blade.php: Menampilkan form untuk mengedit artikel.
b. Implementasi View:
Berikut contoh implementasi view menggunakan Blade template engine:
-
index.blade.php:<!DOCTYPE html> <html> <head> <title>CRUD Artikel</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> </head> <body> <div class="container mt-2"> <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Daftar Artikel</h2> </div> <div class="pull-right mb-2"> <a class="btn btn-success" href="{{ route('artikels.create') }}"> Buat Artikel 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>Judul</th> <th>Isi</th> <th>Penulis</th> <th width="280px">Action</th> </tr> @foreach ($artikels as $artikel) <tr> <td>{{ $loop->iteration }}</td> <td>{{ $artikel->judul }}</td> <td>{{ $artikel->isi }}</td> <td>{{ $artikel->penulis }}</td> <td> <form action="{{ route('artikels.destroy',$artikel->id) }}" method="Post"> <a class="btn btn-primary" href="{{ route('artikels.edit',$artikel->id) }}">Edit</a> @csrf @method('DELETE') <button type="submit" class="btn btn-danger">Delete</button> </form> </td> </tr> @endforeach </table> </div> </body> </html> -
create.blade.php:<!DOCTYPE html> <html> <head> <title>Buat Artikel Baru</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> </head> <body> <div class="container mt-2"> <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Buat Artikel Baru</h2> </div> <div class="pull-right"> <a class="btn btn-primary" href="{{ route('artikels.index') }}"> Kembali</a> </div> </div> </div> @if(session('status')) <div class="alert alert-success mb-1 mt-1"> {{ session('status') }} </div> @endif <form action="{{ route('artikels.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Judul:</strong> <input type="text" name="judul" class="form-control" placeholder="Judul Artikel"> @error('judul') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Isi:</strong> <textarea class="form-control" style="height:150px" name="isi" placeholder="Isi Artikel"></textarea> @error('isi') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Penulis:</strong> <input type="text" name="penulis" class="form-control" placeholder="Penulis Artikel"> @error('penulis') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <button type="submit" class="btn btn-primary ml-3">Submit</button> </div> </div> </form> </div> </body> </html> -
edit.blade.php:<!DOCTYPE html> <html> <head> <title>Edit Artikel</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> </head> <body> <div class="container mt-2"> <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Edit Artikel</h2> </div> <div class="pull-right"> <a class="btn btn-primary" href="{{ route('artikels.index') }}"> Kembali</a> </div> </div> </div> @if(session('status')) <div class="alert alert-success mb-1 mt-1"> {{ session('status') }} </div> @endif <form action="{{ route('artikels.update',$artikel->id) }}" method="POST" enctype="multipart/form-data"> @csrf @method('PUT') <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Judul:</strong> <input type="text" name="judul" value="{{ $artikel->judul }}" class="form-control" placeholder="Judul Artikel"> @error('judul') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Isi:</strong> <textarea class="form-control" style="height:150px" name="isi" placeholder="Isi Artikel">{{ $artikel->isi }}</textarea> @error('isi') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Penulis:</strong> <input type="text" name="penulis" value="{{ $artikel->penulis }}" class="form-control" placeholder="Penulis Artikel"> @error('penulis') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <button type="submit" class="btn btn-primary ml-3">Update</button> </div> </div> </form> </div> </body> </html> -
show.blade.php:<!DOCTYPE html> <html> <head> <title>Detail Artikel</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> </head> <body> <div class="container mt-2"> <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Detail Artikel</h2> </div> <div class="pull-right"> <a class="btn btn-primary" href="{{ route('artikels.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>Judul:</strong> {{ $artikel->judul }} </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Isi:</strong> {{ $artikel->isi }} </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Penulis:</strong> {{ $artikel->penulis }} </div> </div> </div> </div> </body> </html>
6. Konfigurasi Route untuk Mengakses Controller
Langkah terakhir dalam membuat CRUD sederhana adalah mengkonfigurasi route agar pengguna dapat mengakses controller dan view.
a. Konfigurasi Route:
Buka file routes/web.php. Tambahkan route resource untuk ArtikelController:
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersArtikelController;
/*
|--------------------------------------------------------------------------
| 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('artikels', ArtikelController::class);
Dengan menggunakan Route::resource, Laravel secara otomatis akan membuat route untuk semua method CRUD di ArtikelController.
7. Uji Coba Aplikasi CRUD Anda
Setelah semua langkah di atas selesai, saatnya menguji coba aplikasi CRUD Anda.
-
Jalankan server pengembangan Laravel:
php artisan serve -
Buka browser Anda dan akses URL
http://localhost:8000/artikels.
Anda akan melihat daftar artikel (jika ada). Anda dapat membuat artikel baru, mengedit artikel yang sudah ada, menampilkan detail artikel, dan menghapus artikel.
8. Tips Tambahan untuk Pengembangan CRUD di Laravel
Berikut beberapa tips tambahan untuk membuat CRUD di Laravel lebih efisien dan aman:
- Validasi Data: Selalu validasi data yang dikirimkan oleh pengguna sebelum menyimpannya ke database. Gunakan fitur validasi bawaan Laravel. Contohnya sudah ada pada controller di atas.
- Otorisasi: Terapkan otorisasi untuk membatasi akses ke operasi CRUD tertentu. Misalnya, hanya admin yang dapat menghapus artikel. Gunakan fitur otorisasi bawaan Laravel atau package seperti Spatie Permissions.
- Pagination: Jika Anda memiliki banyak data, gunakan pagination untuk membagi data menjadi halaman-halaman yang lebih kecil.
- Search: Tambahkan fitur pencarian untuk memudahkan pengguna mencari data.
- Relasi Database: Manfaatkan relasi database untuk mengelola data yang saling berhubungan. Misalnya, artikel dapat memiliki relasi dengan penulis atau kategori.
- Menggunakan Resource Controller dengan API: Jika Anda ingin membuat API untuk aplikasi Anda, gunakan Resource Controller dengan format JSON.
- Testing: Tulis unit test dan feature test untuk memastikan aplikasi CRUD Anda berfungsi dengan benar.
9. Keamanan dalam CRUD Laravel
Keamanan adalah aspek penting dalam cara membuat CRUD sederhana menggunakan Laravel. Berikut beberapa poin penting:
- CSRF Protection: Laravel secara otomatis memberikan perlindungan terhadap serangan Cross-Site Request Forgery (CSRF). Pastikan untuk menyertakan
@csrfpada setiap form yang menggunakan method selain GET. - XSS Prevention: Gunakan fungsi
e()atau{{ }}(double curly braces) pada Blade template untuk melakukan escaping output, mencegah serangan Cross-Site Scripting (XSS). - SQL Injection: Laravel menggunakan Eloquent ORM yang secara otomatis melindungi aplikasi Anda dari serangan SQL Injection. Gunakan Eloquent dengan benar dan hindari menulis query SQL mentah secara manual.
- Mass Assignment: Seperti yang dijelaskan sebelumnya, definisikan properti
$fillableatau$guardedpada model Anda untuk mengontrol atribut mana yang dapat diisi secara massal. - Authentication dan Authorization: Gunakan sistem otentikasi dan otorisasi Laravel untuk mengontrol akses pengguna ke sumber daya.
10. Kesimpulan: Laravel Memudahkan Pembuatan CRUD
Dengan menggunakan Laravel, cara membuat CRUD sederhana menjadi jauh lebih mudah dan efisien. Laravel menyediakan alat dan fitur yang lengkap, mulai dari model, migrasi, controller, hingga view. Dengan mengikuti langkah-langkah yang dijelaskan dalam artikel ini, Anda dapat membuat aplikasi CRUD sederhana dengan Laravel dalam waktu singkat. Jangan lupa untuk selalu memperhatikan aspek keamanan dan terus belajar untuk meningkatkan kemampuan Anda dalam pengembangan web dengan Laravel. Selamat mencoba!
Semoga artikel ini bermanfaat dan membantu Anda memahami cara membuat CRUD sederhana dengan Laravel versi Indonesia. Teruslah belajar dan eksplorasi fitur-fitur Laravel lainnya untuk mengembangkan aplikasi web yang lebih kompleks dan canggih.



