Laravel 9 adalah framework PHP yang powerful dan populer untuk membangun aplikasi web modern. Salah satu keuntungan utama menggunakan Laravel adalah kemudahannya dalam mengelola data melalui operasi CRUD (Create, Read, Update, Delete). CRUD adalah fondasi dari banyak aplikasi web yang dinamis, memungkinkan pengguna untuk berinteraksi dan memanipulasi data secara efisien. Artikel ini akan memandu Anda langkah demi langkah dalam cara membuat CRUD dengan Laravel 9 agar database website Anda menjadi lebih dinamis dan interaktif.
1. Apa Itu CRUD dan Mengapa Penting dalam Laravel 9?
CRUD adalah singkatan dari Create (membuat data baru), Read (membaca atau menampilkan data), Update (memperbarui data yang sudah ada), dan Delete (menghapus data). Operasi ini adalah dasar dari interaksi pengguna dengan data dalam aplikasi web. Tanpa CRUD, website Anda hanya akan menampilkan informasi statis, tanpa kemampuan untuk menambahkan, mengubah, atau menghapus data.
Dalam konteks Laravel 9, CRUD dipermudah dengan fitur-fitur bawaan seperti:
- Eloquent ORM: Mempermudah interaksi dengan database menggunakan sintaks PHP yang intuitif.
- Migrations: Membantu mengelola skema database secara terstruktur dan terorganisir.
- Controllers: Mengorganisir logika aplikasi, termasuk operasi CRUD.
- Routes: Menentukan bagaimana permintaan (request) diarahkan ke controller yang sesuai.
- Blade Templating Engine: Mempermudah pembuatan tampilan (view) yang dinamis.
Menguasai cara membuat CRUD dengan Laravel 9 adalah kunci untuk mengembangkan aplikasi web yang dinamis, responsif, dan mudah dikelola. Ini akan memungkinkan Anda untuk:
- Membuat sistem manajemen konten (CMS).
- Membangun aplikasi e-commerce.
- Mengembangkan aplikasi sosial media.
- Mengelola data pengguna dan informasi lainnya.
2. Persiapan Awal: Instalasi Laravel 9 dan Konfigurasi Database
Sebelum memulai cara membuat CRUD dengan Laravel 9, pastikan Anda sudah memiliki lingkungan pengembangan yang siap. Ini termasuk:
- PHP: Versi 8.0 atau lebih tinggi.
- Composer: Package manager untuk PHP.
- Database: MySQL, PostgreSQL, SQLite, atau database yang didukung Laravel lainnya.
- Web Server: Apache atau Nginx.
Setelah memastikan persyaratan terpenuhi, ikuti langkah-langkah berikut:
-
Instal Laravel 9: Buka terminal atau command prompt Anda dan jalankan perintah berikut:
composer create-project laravel/laravel:^9.0 nama-proyek cd nama-proyek
Ganti
nama-proyek
dengan nama proyek yang Anda inginkan. -
Konfigurasi Database: Buka file
.env
di direktori proyek Anda. Temukan bagian yang berhubungan dengan konfigurasi database dan sesuaikan dengan kredensial database Anda. Contoh konfigurasi untuk MySQL:DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=username_database DB_PASSWORD=password_database
Ganti
nama_database
,username_database
, danpassword_database
dengan informasi yang sesuai. -
Migrasi Database: Laravel menggunakan migrations untuk mengelola skema database. Secara default, Laravel sudah memiliki beberapa migrations bawaan. Anda dapat menjalankan migrations ini dengan perintah:
php artisan migrate
Perintah ini akan membuat tabel
users
,password_resets
, danfailed_jobs
di database Anda.
3. Membuat Model dan Migrasi: Definisi Struktur Data
Langkah selanjutnya dalam cara membuat CRUD dengan Laravel 9 adalah mendefinisikan struktur data yang akan Anda kelola. Mari kita ambil contoh sederhana: mengelola data “Produk”. Kita perlu membuat model dan migrasi untuk tabel products
.
-
Membuat Model: Gunakan perintah Artisan untuk membuat model
Product
:php artisan make:model Product
Perintah ini akan membuat file
app/Models/Product.php
. -
Membuat Migrasi: Sekarang, buat migrasi untuk tabel
products
:php artisan make:migration create_products_table
Perintah ini akan membuat file migrasi baru di direktori
database/migrations
. Buka file migrasi tersebut dan definisikan skema tabelproducts
. Contoh:<?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:
$table->id();
membuat kolomid
sebagai primary key auto-increment.$table->string('name');
membuat kolomname
dengan tipe data string.$table->text('description')->nullable();
membuat kolomdescription
dengan tipe data text yang bisa bernilai null.$table->decimal('price', 10, 2);
membuat kolomprice
dengan tipe data decimal (10 digit total, 2 digit di belakang koma).$table->integer('stock');
membuat kolomstock
dengan tipe data integer.$table->timestamps();
membuat kolomcreated_at
danupdated_at
untuk menyimpan informasi timestamp.
-
Menjalankan Migrasi: Setelah mendefinisikan skema tabel, jalankan migrasi untuk membuat tabel
products
di database Anda:php artisan migrate
-
Mass Assignment pada Model: Buka file
app/Models/Product.php
dan tambahkan$fillable
property untuk mengizinkan mass assignment (mengisi data secara massal):<?php namespace AppModels; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateDatabaseEloquentModel; class Product extends Model { use HasFactory; protected $fillable = [ 'name', 'description', 'price', 'stock', ]; }
Dengan menambahkan
$fillable
, Anda menentukan kolom mana saja yang boleh diisi melalui mass assignment. Ini penting untuk keamanan aplikasi Anda.
4. Membuat Controller: Logika Bisnis CRUD
Setelah model dan migrasi dibuat, saatnya untuk membuat controller yang akan menangani logika bisnis CRUD.
-
Membuat Controller: Gunakan perintah Artisan untuk membuat controller
ProductController
:php artisan make:controller ProductController
Perintah ini akan membuat file
app/Http/Controllers/ProductController.php
. -
Implementasi Fungsi CRUD: Buka file
app/Http/Controllers/ProductController.php
dan tambahkan fungsi-fungsi CRUD:<?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', 'stock' => 'required|integer', ]); 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', 'stock' => 'required|integer', ]); $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'); } }
Penjelasan fungsi:
index()
: Menampilkan daftar semua produk. Mengambil data dari database menggunakanProduct::all()
dan mengirimkannya ke viewproducts.index
.create()
: Menampilkan form untuk membuat produk baru. Menampilkan viewproducts.create
.store(Request $request)
: Menyimpan produk baru ke database. Melakukan validasi input menggunakan$request->validate()
, kemudian membuat produk baru menggunakanProduct::create($request->all())
. Setelah berhasil, redirect ke halamanproducts.index
dengan pesan sukses.show(Product $product)
: Menampilkan detail satu produk. Mengirim data produk ke viewproducts.show
.edit(Product $product)
: Menampilkan form untuk mengedit produk yang sudah ada. Mengirim data produk ke viewproducts.edit
.update(Request $request, Product $product)
: Memperbarui produk di database. Melakukan validasi input menggunakan$request->validate()
, kemudian memperbarui produk menggunakan$product->update($request->all())
. Setelah berhasil, redirect ke halamanproducts.index
dengan pesan sukses.destroy(Product $product)
: Menghapus produk dari database. Menghapus produk menggunakan$product->delete()
. Setelah berhasil, redirect ke halamanproducts.index
dengan pesan sukses.
5. Membuat Routes: Menentukan Alur Permintaan
Langkah selanjutnya dalam cara membuat CRUD dengan Laravel 9 adalah menentukan bagaimana permintaan (request) diarahkan ke controller yang sesuai. Kita akan menggunakan resource routing untuk mempermudah definisi routes CRUD.
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);
Route::resource('products', ProductController::class);
akan secara otomatis membuat routes untuk semua fungsi CRUD di ProductController
:
GET /products
->ProductController@index
GET /products/create
->ProductController@create
POST /products
->ProductController@store
GET /products/{product}
->ProductController@show
GET /products/{product}/edit
->ProductController@edit
PUT/PATCH /products/{product}
->ProductController@update
DELETE /products/{product}
->ProductController@destroy
6. Membuat Views: Menampilkan Data dan Form Input
Langkah terakhir dalam cara membuat CRUD dengan Laravel 9 adalah membuat views untuk menampilkan data dan form input. Kita akan membuat view untuk menampilkan daftar produk, form untuk membuat produk baru, form untuk mengedit produk, dan detail produk.
Buat direktori resources/views/products
dan buat file-file berikut:
-
index.blade.php
(Menampilkan daftar produk):<!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"> <h1>Daftar Produk</h1> <a href="{{ route('products.create') }}" class="btn btn-success mb-3">Create New Product</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>Name</th> <th>Price</th> <th>Stock</th> <th width="280px">Action</th> </tr> @foreach ($products as $product) <tr> <td>{{ ++$i }}</td> <td>{{ $product->name }}</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 </table> {!! $products->links() !!} </div> </body> </html>
-
create.blade.php
(Form untuk membuat produk baru):<!DOCTYPE html> <html> <head> <title>Create Product</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Create New Product</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('products.store') }}" method="POST"> @csrf <div class="mb-3"> <label for="name" class="form-label">Name:</label> <input type="text" class="form-control" id="name" name="name" placeholder="Name"> </div> <div class="mb-3"> <label for="description" class="form-label">Description:</label> <textarea class="form-control" style="height:150px" name="description" placeholder="Description"></textarea> </div> <div class="mb-3"> <label for="price" class="form-label">Price:</label> <input type="text" class="form-control" id="price" name="price" placeholder="Price"> </div> <div class="mb-3"> <label for="stock" class="form-label">Stock:</label> <input type="text" class="form-control" id="stock" name="stock" placeholder="Stock"> </div> <button type="submit" class="btn btn-primary">Submit</button> <a class="btn btn-secondary" href="{{ route('products.index') }}">Back</a> </form> </div> </body> </html>
-
edit.blade.php
(Form untuk mengedit produk):<!DOCTYPE html> <html> <head> <title>Edit Product</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Edit Product</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('products.update', $product->id) }}" method="POST"> @csrf @method('PUT') <div class="mb-3"> <label for="name" class="form-label">Name:</label> <input type="text" class="form-control" id="name" name="name" value="{{ $product->name }}" placeholder="Name"> </div> <div class="mb-3"> <label for="description" class="form-label">Description:</label> <textarea class="form-control" style="height:150px" name="description" placeholder="Description">{{ $product->description }}</textarea> </div> <div class="mb-3"> <label for="price" class="form-label">Price:</label> <input type="text" class="form-control" id="price" name="price" value="{{ $product->price }}" placeholder="Price"> </div> <div class="mb-3"> <label for="stock" class="form-label">Stock:</label> <input type="text" class="form-control" id="stock" name="stock" value="{{ $product->stock }}" placeholder="Stock"> </div> <button type="submit" class="btn btn-primary">Submit</button> <a class="btn btn-secondary" href="{{ route('products.index') }}">Back</a> </form> </div> </body> </html>
-
show.blade.php
(Detail produk):<!DOCTYPE html> <html> <head> <title>Show Product</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <h1>Show Product</h1> <div class="mb-3"> <strong>Name:</strong> {{ $product->name }} </div> <div class="mb-3"> <strong>Description:</strong> {{ $product->description }} </div> <div class="mb-3"> <strong>Price:</strong> {{ $product->price }} </div> <div class="mb-3"> <strong>Stock:</strong> {{ $product->stock }} </div> <a class="btn btn-secondary" href="{{ route('products.index') }}">Back</a> </div> </body> </html>
Penjelasan View:
- Masing-masing view menggunakan Bootstrap untuk styling agar tampilan lebih menarik. Anda bisa mengganti styling sesuai kebutuhan.
- View
index.blade.php
menampilkan daftar produk dalam bentuk tabel. Terdapat link untuk membuat produk baru, melihat detail produk, mengedit produk, dan menghapus produk. - View
create.blade.php
danedit.blade.php
menampilkan form dengan input untuk nama, deskripsi, harga, dan stok produk. Form ini mengirimkan data ke controller untuk diproses. - View
show.blade.php
menampilkan detail informasi produk. - Semua view menggunakan Blade templating engine Laravel untuk menampilkan data dinamis dan membuat link ke routes yang sesuai.
7. Uji Coba Aplikasi CRUD Laravel 9 Anda
Setelah semua langkah di atas selesai, Anda dapat menguji coba aplikasi CRUD Laravel 9 Anda. Jalankan server pengembangan Laravel:
php artisan serve
Buka browser Anda dan kunjungi http://localhost:8000/products
. Anda akan melihat halaman daftar produk. Anda dapat mencoba membuat produk baru, mengedit produk, melihat detail produk, dan menghapus produk.
8. Validasi Data: Meningkatkan Keamanan dan Integritas Data
Validasi data adalah bagian penting dalam cara membuat CRUD dengan Laravel 9 untuk memastikan data yang disimpan di database valid dan sesuai dengan aturan yang telah ditentukan. Kita telah melihat sedikit contoh validasi di dalam fungsi store
dan update
di ProductController
. Mari kita bahas lebih detail tentang validasi data di Laravel.
Laravel menyediakan berbagai cara untuk melakukan validasi data, termasuk:
- Validasi Langsung di Controller: Seperti yang sudah kita lakukan sebelumnya, Anda dapat menggunakan method
$request->validate()
di dalam controller untuk melakukan validasi. - Form Request: Membuat class khusus untuk menangani validasi form. Ini membuat kode controller Anda lebih bersih dan terorganisir.
- Custom Validation Rules: Membuat aturan validasi sendiri jika aturan bawaan Laravel tidak mencukupi.
Contoh menggunakan Form Request:
-
Buat Form Request: Gunakan perintah Artisan untuk membuat Form Request
ProductRequest
:php artisan make:request ProductRequest
Perintah ini akan membuat file
app/Http/Requests/ProductRequest.php
. -
Definisikan Aturan Validasi: Buka file
app/Http/Requests/ProductRequest.php
dan definisikan aturan validasi di methodrules()
:<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class ProductRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; // Ubah menjadi true jika tidak ada otorisasi khusus } /** * 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', 'stock' => 'required|integer|min:0', ]; } }
Pada kode di atas:
'name' => 'required|max:255'
berarti kolomname
wajib diisi (required) dan panjang maksimal 255 karakter.'description' => 'nullable'
berarti kolomdescription
boleh tidak diisi (nullable).'price' => 'required|numeric|min:0'
berarti kolomprice
wajib diisi (required), harus berupa angka (numeric), dan minimal 0.'stock' => 'required|integer|min:0'
berarti kolomstock
wajib diisi (required), harus berupa integer, dan minimal 0.
-
Gunakan Form Request di Controller: Ubah
store
danupdate
method diProductController
untuk menggunakanProductRequest
:<?php namespace AppHttpControllers; use AppModelsProduct; use AppHttpRequestsProductRequest; // Import ProductRequest use IlluminateHttpRequest; class ProductController extends Controller { // ... (kode sebelumnya) public function store(ProductRequest $request) // Gunakan ProductRequest { Product::create($request->all()); return redirect()->route('products.index') ->with('success','Product created successfully.'); } public function update(ProductRequest $request, Product $product) // Gunakan ProductRequest { $product->update($request->all()); return redirect()->route('products.index') ->with('success','Product updated successfully'); } // ... (kode sebelumnya) }
Dengan menggunakan Form Request, Laravel akan otomatis menjalankan validasi berdasarkan aturan yang telah Anda definisikan di
ProductRequest
. Jika validasi gagal, Laravel akan otomatis redirect kembali ke halaman sebelumnya dengan pesan error.
9. Otentikasi dan Otorisasi: Mengamankan Aplikasi CRUD Anda
Otentikasi dan otorisasi adalah aspek penting dalam cara membuat CRUD dengan Laravel 9 untuk memastikan hanya pengguna yang berwenang yang dapat mengakses dan memanipulasi data.
- Otentikasi: Proses memverifikasi identitas pengguna (misalnya, dengan menggunakan username dan password).
- Otorisasi: Proses menentukan apa yang boleh dilakukan oleh pengguna setelah berhasil diotentikasi (misalnya, hanya admin yang boleh menghapus produk).
Laravel menyediakan fitur otentikasi bawaan yang mudah digunakan.
-
Generate Scaffold Otentikasi: Jalankan perintah berikut untuk membuat scaffold otentikasi:
composer require laravel/ui php artisan ui:auth npm install && npm run dev php artisan migrate
Perintah ini akan membuat routes, controller, dan view untuk login, register, dan reset password. Pastikan Anda sudah menjalankan
php artisan migrate
setelah menjalankan perintah di atas. -
Gunakan Middleware
auth
: Lindungi routes yang memerlukan otentikasi dengan menggunakan middlewareauth
. Buka fileroutes/web.php
dan tambahkan middlewareauth
ke routesproducts
:<?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)->middleware('auth');
Dengan menambahkan
->middleware('auth')
, hanya pengguna yang sudah login yang dapat mengakses routesproducts
. Jika pengguna belum login, mereka akan otomatis diarahkan ke halaman login. -
Implementasi Otorisasi: Untuk implementasi otorisasi, Anda bisa menggunakan Policies di Laravel. Policies mendefinisikan aturan otorisasi untuk model tertentu. Contoh:
-
Buat Policy untuk Model Product:
php artisan make:policy ProductPolicy --model=Product
-
Buka
app/Policies/ProductPolicy.php
dan definisikan aturan otorisasi. Misalnya, hanya admin yang boleh menghapus product.<?php namespace AppPolicies; use AppModelsUser; use AppModelsProduct; use IlluminateAuthAccessHandlesAuthorization; class ProductPolicy { use HandlesAuthorization; /** * Determine whether the user can view any models. * * @param AppModelsUser $user * @return IlluminateAuthAccessResponse|bool */ public function viewAny(User $user) { return true; // Semua user boleh melihat daftar produk } /** * Determine whether the user can view the model. * * @param AppModelsUser $user * @param AppModelsProduct $product * @return IlluminateAuthAccessResponse|bool */ public function view(User $user, Product $product) { return true; // Semua user boleh melihat detail product } /** * Determine whether the user can create models. * * @param AppModelsUser $user * @return IlluminateAuthAccessResponse|bool */ public function create(User $user) { return $user->is_admin; // Hanya admin yang boleh membuat product } /** * Determine whether the user can update the model. * * @param AppModelsUser $user * @param AppModelsProduct $product * @return IlluminateAuthAccessResponse|bool */ public function update(User $user, Product $product) { return $user->is_admin; // Hanya admin yang boleh mengupdate product } /** * Determine whether the user can delete the model. * * @param AppModelsUser $user * @param AppModelsProduct $product * @return IlluminateAuthAccessResponse|bool */ public function delete(User $user, Product $product) { return $user->is_admin; // Hanya admin yang boleh menghapus product } /** * Determine whether the user can restore the model. * * @param AppModelsUser $user * @param AppModelsProduct $product * @return IlluminateAuthAccessResponse|bool */ public function restore(User $user, Product $product) { // } /** * Determine whether the user can permanently delete the model. * * @param AppModelsUser $user * @param AppModelsProduct $product * @return IlluminateAuthAccessResponse|bool */ public function forceDelete(User $user, Product $product) { // } }
(Pastikan Anda menambahkan
is_admin
field di tabel users dan di Model User) -
Register Policy di
AuthServiceProvider
.<?php namespace AppProviders; use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider; use IlluminateSupportFacadesGate; use AppModelsProduct; use AppPoliciesProductPolicy; class AuthServiceProvider extends ServiceProvider { /** * The model to policy mappings for the application. * * @var array<class-string, class-string> */ protected $policies = [ Product::class => ProductPolicy::class, ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); // } }
-
Gunakan Policy di Controller.
<?php namespace AppHttpControllers; use AppModelsProduct; use AppHttpRequestsProductRequest; use IlluminateHttpRequest; use IlluminateSupportFacadesGate; // Import Gate class ProductController extends Controller { // ... (kode sebelumnya) public function destroy(Product $product) { if (Gate::denies('delete', $product)) { abort(403, 'Unauthorized action.'); // Jika tidak diizinkan, tampilkan error } $product->delete(); return redirect()->route('products.index') ->with('success','Product deleted successfully'); } }
-
Dengan langkah-langkah di atas, Anda telah mengamankan aplikasi CRUD Anda dengan otentikasi dan otorisasi.
10. Meningkatkan Performa Aplikasi CRUD Laravel 9
Setelah aplikasi CRUD Anda berjalan dengan baik, Anda dapat meningkatkan performanya dengan beberapa teknik:
- Caching: Gunakan caching untuk menyimpan data yang sering diakses, sehingga mengurangi beban database. Laravel menyediakan berbagai fitur caching yang mudah digunakan.
- Eager Loading: Hindari masalah N+1 query dengan menggunakan eager loading. Eager loading memungkinkan Anda untuk mengambil data relasi bersamaan dengan data utama, sehingga mengurangi jumlah query ke database.
- Indexing Database: Pastikan kolom yang sering digunakan dalam query telah diindeks. Indeks membantu database untuk mencari data lebih cepat.
- Optimize Queries: Tulis query yang efisien dan hindari penggunaan query yang kompleks jika tidak diperlukan.
- Pagination: Gunakan pagination untuk memecah data menjadi halaman-halaman yang lebih kecil, sehingga mengurangi beban browser dan server.
- Minify Assets: Minifikasi file CSS dan JavaScript untuk mengurangi ukuran file dan mempercepat waktu loading halaman.
Kesimpulan
Artikel ini telah memandu Anda langkah demi langkah dalam cara membuat CRUD dengan Laravel 9. Anda telah mempelajari cara membuat model, migrasi, controller, routes, dan views. Anda juga telah mempelajari cara memvalidasi data, mengamankan aplikasi dengan otentikasi dan otorisasi, dan meningkatkan performa aplikasi. Dengan menguasai CRUD, Anda dapat membangun aplikasi web yang dinamis dan interaktif dengan mudah menggunakan Laravel 9. Jangan ragu untuk bereksperimen dan mencoba fitur-fitur Laravel lainnya untuk mengembangkan aplikasi yang lebih kompleks dan canggih. Selamat mencoba!