# Cara Membuat CRUD dengan Laravel 9: Panduan Lengkap
Laravel 9 adalah framework PHP yang populer untuk pengembangan web modern. Salah satu tugas paling mendasar dalam pengembangan web adalah implementasi CRUD (Create, Read, Update, Delete), yaitu operasi dasar untuk mengelola data dalam database. Artikel ini akan memberikan panduan lengkap tentang **cara membuat CRUD dengan Laravel 9**, dari instalasi hingga pengujian akhir. Mari kita mulai!
## 1. Persiapan Awal: Instalasi Laravel 9 dan Konfigurasi Database
Sebelum kita mulai ngoding, kita perlu memastikan Laravel 9 sudah terinstall di komputer kita dan terkoneksi dengan database. Kalau kamu belum punya Laravel 9, jangan khawatir! Kita akan lakukan langkah demi langkah.
* **Instalasi Laravel 9:**
Pastikan kamu sudah punya PHP (minimal versi 8.0) dan Composer terinstall. Kalau belum, kamu bisa download dari website resminya. Setelah itu, buka terminal atau command prompt kamu dan ketik perintah berikut:
```bash
composer create-project --prefer-dist laravel/laravel nama-proyek-crud
Ganti `nama-proyek-crud` dengan nama proyek yang kamu inginkan. Composer akan mendownload dan menginstall semua dependencies yang dibutuhkan.
-
Konfigurasi Database:
Setelah instalasi selesai, buka file
.envdi direktori proyek kamu. Cari bagian yang berhubungan dengan database (biasanya diawali denganDB_). Sesuaikan nilai-nilai berikut dengan konfigurasi database kamu:DB_CONNECTION=mysql # Atau database yang kamu gunakan (pgsql, sqlite, dll.) DB_HOST=127.0.0.1 # Atau alamat server database kamu DB_PORT=3306 # Atau port database kamu DB_DATABASE=nama_database # Nama database yang akan kamu gunakan DB_USERNAME=username_database # Username untuk mengakses database DB_PASSWORD=password_database # Password untuk mengakses databaseJangan lupa buat database dengan nama yang sesuai di server database kamu. Setelah itu, jalankan perintah berikut untuk membuat tabel-tabel yang dibutuhkan (jika belum ada):
php artisan migratePerintah ini akan menjalankan migration yang ada di folder
database/migrations. Kita akan membuat migration kita sendiri nanti.
2. Membuat Model dan Migration untuk Mengelola Data
Sekarang kita akan membuat Model dan Migration untuk data yang akan kita kelola. Misalnya, kita akan membuat CRUD untuk mengelola data buku.
-
Membuat Model:
Buka terminal atau command prompt kamu dan ketik perintah berikut:
php artisan make:model Book -mPerintah ini akan membuat dua file:
app/Models/Book.php: Model untuk representasi data buku.database/migrations/yyyy_mm_dd_create_books_table.php: Migration untuk membuat tabelbooksdi database.yyyy_mm_ddakan diganti dengan tanggal saat ini.
-
Mengedit Migration:
Buka file migration yang baru saja dibuat. Edit method
up()untuk mendefinisikan struktur tabelbooks. Misalnya:<?php use IlluminateDatabaseMigrationsMigration; use IlluminateDatabaseSchemaBlueprint; use IlluminateSupportFacadesSchema; return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('books', function (Blueprint $table) { $table->id(); $table->string('title'); $table->string('author'); $table->text('description')->nullable(); $table->integer('publication_year')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('books'); } };Kode di atas akan membuat tabel
booksdengan kolomid,title,author,description,publication_year,created_at, danupdated_at. -
Menjalankan Migration:
Setelah selesai mengedit migration, jalankan perintah berikut:
php artisan migratePerintah ini akan membuat tabel
booksdi database kamu.
3. Membuat Controller untuk Logika CRUD
Controller akan menangani logika untuk setiap operasi CRUD.
-
Membuat Controller:
Buka terminal atau command prompt kamu dan ketik perintah berikut:
php artisan make:controller BookController --resourcePerintah ini akan membuat file
app/Http/Controllers/BookController.phpdengan method-method yang dibutuhkan untuk operasi CRUD (index, create, store, show, edit, update, destroy). Opsi--resourcesecara otomatis membuat method-method tersebut. -
Mengedit Controller:
Buka file
app/Http/Controllers/BookController.phpdan edit setiap method untuk mengimplementasikan logika CRUD.-
index(): Menampilkan daftar semua buku.public function index() { $books = Book::all(); // Mengambil semua data buku dari database return view('books.index', compact('books')); // Mengirim data buku ke view 'books.index' } -
create(): Menampilkan form untuk membuat buku baru.public function create() { return view('books.create'); // Menampilkan view 'books.create' } -
store(): Menyimpan data buku baru ke database.public function store(Request $request) { $request->validate([ 'title' => 'required', 'author' => 'required', 'publication_year' => 'nullable|integer', ]); Book::create($request->all()); // Membuat buku baru dengan data dari request return redirect()->route('books.index') // Redirect ke halaman index ->with('success','Buku berhasil ditambahkan.'); // Menampilkan pesan sukses } -
show(): Menampilkan detail buku tertentu.public function show(Book $book) { return view('books.show', compact('book')); // Menampilkan view 'books.show' dengan data buku } -
edit(): Menampilkan form untuk mengedit buku.public function edit(Book $book) { return view('books.edit', compact('book')); // Menampilkan view 'books.edit' dengan data buku } -
update(): Mengupdate data buku di database.public function update(Request $request, Book $book) { $request->validate([ 'title' => 'required', 'author' => 'required', 'publication_year' => 'nullable|integer', ]); $book->update($request->all()); // Mengupdate data buku dengan data dari request return redirect()->route('books.index') // Redirect ke halaman index ->with('success','Buku berhasil diupdate.'); // Menampilkan pesan sukses } -
destroy(): Menghapus buku dari database.public function destroy(Book $book) { $book->delete(); // Menghapus buku return redirect()->route('books.index') // Redirect ke halaman index ->with('success','Buku berhasil dihapus.'); // Menampilkan pesan sukses }
Penting: Pastikan untuk menambahkan
use AppModelsBook;danuse IlluminateHttpRequest;di bagian atas fileBookController.php. -
4. Membuat View untuk Menampilkan Data
View akan menampilkan data ke pengguna. Kita perlu membuat view untuk setiap operasi CRUD.
-
Membuat Folder
resources/views/books:Buat folder
booksdi dalam folderresources/views. Folder ini akan berisi semua view yang berhubungan dengan buku. -
Membuat File View:
Buat file-file berikut di dalam folder
resources/views/books:-
index.blade.php: Menampilkan daftar semua buku.<!DOCTYPE html> <html> <head> <title>Daftar Buku</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Daftar Buku</h1> @if ($message = Session::get('success')) <div class="alert alert-success"> <p>{{ $message }}</p> </div> @endif <a class="btn btn-success" href="{{ route('books.create') }}"> Tambah Buku Baru</a> <table class="table table-bordered"> <tr> <th>No</th> <th>Judul</th> <th>Penulis</th> <th>Tahun Terbit</th> <th width="280px">Action</th> </tr> @foreach ($books as $book) <tr> <td>{{ ++$i }}</td> <td>{{ $book->title }}</td> <td>{{ $book->author }}</td> <td>{{ $book->publication_year }}</td> <td> <form action="{{ route('books.destroy',$book->id) }}" method="POST"> <a class="btn btn-info" href="{{ route('books.show',$book->id) }}">Show</a> <a class="btn btn-primary" href="{{ route('books.edit',$book->id) }}">Edit</a> @csrf @method('DELETE') <button type="submit" class="btn btn-danger">Delete</button> </form> </td> </tr> @endforeach </table> {!! $books->links() !!} </div> </body> </html> -
create.blade.php: Menampilkan form untuk membuat buku baru.<!DOCTYPE html> <html> <head> <title>Tambah Buku Baru</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Tambah Buku Baru</h1> @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('books.store') }}" method="POST"> @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="title" class="form-control" placeholder="Judul"> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Penulis:</strong> <input type="text" name="author" class="form-control" placeholder="Penulis"> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Tahun Terbit:</strong> <input type="number" name="publication_year" class="form-control" placeholder="Tahun Terbit"> </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 text-center"> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </form> </div> </body> </html> -
show.blade.php: Menampilkan detail buku tertentu.<!DOCTYPE html> <html> <head> <title>Detail Buku</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Detail Buku</h1> <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Judul:</strong> {{ $book->title }} </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Penulis:</strong> {{ $book->author }} </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Tahun Terbit:</strong> {{ $book->publication_year }} </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Deskripsi:</strong> {{ $book->description }} </div> </div> </div> </div> </body> </html> -
edit.blade.php: Menampilkan form untuk mengedit buku.<!DOCTYPE html> <html> <head> <title>Edit Buku</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Edit Buku</h1> @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('books.update',$book->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>Judul:</strong> <input type="text" name="title" value="{{ $book->title }}" class="form-control" placeholder="Judul"> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Penulis:</strong> <input type="text" name="author" value="{{ $book->author }}" class="form-control" placeholder="Penulis"> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Tahun Terbit:</strong> <input type="number" name="publication_year" value="{{ $book->publication_year }}" class="form-control" placeholder="Tahun Terbit"> </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">{{ $book->description }}</textarea> </div> </div> <div class="col-xs-12 col-sm-12 col-md-12 text-center"> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </form> </div> </body> </html>
Pastikan untuk menyesuaikan tampilan view sesuai dengan kebutuhan kamu. Gunakan CSS framework seperti Bootstrap untuk tampilan yang lebih menarik. Contoh di atas menggunakan Bootstrap 5.
-
5. Mendefinisikan Route untuk Akses CRUD
Routes mendefinisikan URL yang akan memanggil method-method di controller.
-
Mengedit
routes/web.php:Buka file
routes/web.phpdan tambahkan route berikut:use AppHttpControllersBookController; use IlluminateSupportFacadesRoute; Route::resource('books', BookController::class);Route ini akan otomatis membuat route untuk semua method di
BookController, seperti:GET /books:BookController@indexGET /books/create:BookController@createPOST /books:BookController@storeGET /books/{book}:BookController@showGET /books/{book}/edit:BookController@editPUT/PATCH /books/{book}:BookController@updateDELETE /books/{book}:BookController@destroy
6. Pengujian CRUD Laravel 9: Verifikasi Fungsionalitas
Setelah semua langkah di atas selesai, saatnya melakukan pengujian untuk memastikan semua fungsi CRUD berjalan dengan baik.
-
Menjalankan Server Pengembangan:
Buka terminal atau command prompt kamu dan ketik perintah berikut:
php artisan servePerintah ini akan menjalankan server pengembangan Laravel. Buka browser kamu dan akses URL yang ditampilkan (biasanya
http://127.0.0.1:8000). -
Menguji CRUD:
Akses URL
/booksuntuk melihat daftar buku. Kamu bisa menambahkan buku baru, melihat detail buku, mengedit buku, dan menghapus buku. Pastikan semua fungsi berjalan dengan benar. -
Tips Tambahan:
- Validasi Data: Pastikan kamu melakukan validasi data di controller sebelum menyimpan data ke database. Ini akan mencegah data yang tidak valid masuk ke database.
- Error Handling: Implementasikan error handling yang baik untuk menangani exception yang mungkin terjadi.
- Otentikasi dan Otorisasi: Jika aplikasi kamu membutuhkan otentikasi dan otorisasi, pastikan kamu mengimplementasikannya dengan benar.
- Testing: Tulis unit test dan feature test untuk memastikan kode kamu berfungsi dengan baik dan mencegah regression.
- Pagination: Jika data yang kamu kelola banyak, gunakan pagination untuk menampilkan data secara bertahap.
7. Fitur Tambahan: Search dan Filter Data
Selain operasi CRUD dasar, seringkali kita membutuhkan fitur search dan filter untuk memudahkan pengguna mencari data yang mereka inginkan.
-
Menambahkan Form Search di View
index.blade.php:<form action="{{ route('books.index') }}" method="GET"> <div class="input-group mb-3"> <input type="text" class="form-control" placeholder="Cari Judul atau Penulis" name="search" value="{{ request('search') }}"> <button class="btn btn-outline-secondary" type="submit" id="button-addon2">Cari</button> </div> </form> -
Memodifikasi Method
index()diBookController.php:public function index(Request $request) { $search = $request->input('search'); $books = Book::query() ->when($search, function ($query, $search) { return $query->where('title', 'like', '%'.$search.'%') ->orWhere('author', 'like', '%'.$search.'%'); }) ->paginate(10); // Menampilkan 10 data per halaman return view('books.index', compact('books')) ->with('i', ($request->input('page', 1) - 1) * 10); }Kode di atas akan menambahkan logika search ke method
index(). Pengguna bisa mencari buku berdasarkan judul atau penulis. Kita juga menggunakan pagination untuk menampilkan data secara bertahap. -
Menambahkan Fitur Filter:
Fitur filter bisa diimplementasikan dengan cara yang mirip dengan fitur search. Kamu bisa menambahkan form filter di view
index.blade.phpdan memodifikasi methodindex()diBookController.phpuntuk mengaplikasikan filter.
8. Integrasi dengan Library dan Package Laravel Populer
Laravel memiliki banyak library dan package yang bisa membantu kamu mempercepat pengembangan CRUD.
- Laravel UI atau Breeze: Memberikan scaffolding untuk otentikasi dan tampilan default.
- Laravel Debugbar: Membantu kamu debugging aplikasi dengan menampilkan informasi debugging di browser.
- Laravel Collective HTML: Memudahkan pembuatan form HTML dengan helper.
- Yajra Datatables: Menyediakan fitur datatables yang canggih untuk menampilkan data.
- Intervention Image: Memudahkan manipulasi gambar.
Integrasi library dan package ini akan sangat membantu dalam mengembangkan aplikasi CRUD yang lebih kompleks dan efisien. Pastikan untuk membaca dokumentasi masing-masing library/package untuk mengetahui cara penggunaannya.
9. Keamanan dalam Implementasi CRUD Laravel 9
Keamanan adalah aspek penting dalam pengembangan aplikasi web. Pastikan kamu memperhatikan hal-hal berikut saat mengimplementasikan CRUD di Laravel 9:
- Cross-Site Scripting (XSS) Protection: Gunakan fitur escaping Blade (
{{ ... }}) untuk mencegah XSS. - Cross-Site Request Forgery (CSRF) Protection: Gunakan
@csrfdirective di dalam form untuk mencegah CSRF. - SQL Injection Protection: Gunakan Eloquent ORM untuk mencegah SQL injection.
- Mass Assignment Protection: Gunakan
fillableatauguardedproperty di model untuk melindungi dari mass assignment. - Otentikasi dan Otorisasi: Implementasikan otentikasi dan otorisasi yang kuat untuk melindungi data dari akses yang tidak sah.
- Validasi Input: Validasi input pengguna untuk memastikan hanya data yang valid yang disimpan ke database.
Dengan memperhatikan aspek keamanan ini, kamu bisa membangun aplikasi CRUD yang lebih aman dan terpercaya.
10. Kesimpulan: Cara Membuat CRUD dengan Laravel 9 yang Efisien
Membuat CRUD dengan Laravel 9 bisa menjadi lebih mudah dan efisien dengan mengikuti panduan ini. Mulai dari instalasi, konfigurasi database, pembuatan model dan migration, implementasi controller dan view, hingga pengujian akhir, semua langkah dijelaskan secara detail. Jangan lupa untuk menambahkan fitur tambahan seperti search dan filter, integrasi dengan library populer, dan memperhatikan aspek keamanan. Dengan memahami cara membuat CRUD dengan Laravel 9 dengan benar, kamu akan mampu membangun aplikasi web yang handal dan efisien. Selamat mencoba!


