Akses kelas selamanya

Ambil Promo
flash sale
hamburger-menu

Tips All

Meningkatkan skills menjadi 1% lebih baik

Reset
Kelas Tutorial CRUD Role Permission dengan Laravel 11, Spatie, dan Filament Projek Toko Baju Online di BuildWithAngga

Tutorial CRUD Role Permission dengan Laravel 11, Spatie, dan Filament Projek Toko Baju Online

Pada artikel ini, kita akan belajar bagaimana membangun CRUD (Create, Read, Update, Delete) untuk data role dan permission dalam sebuah projek website toko baju online. Dalam dunia web development, pengelolaan role dan permission sangat penting karena dapat meningkatkan pengalaman pengguna (user experience) sekaligus menjaga keamanan data yang ada di dalam sebuah website. Pentingnya Role dan Permission Setiap pengguna di dalam sebuah website memiliki peran dan hak akses yang berbeda-beda. Dengan membagi peran (role) dan hak akses (permission), kita dapat memastikan bahwa hanya pengguna dengan otorisasi tertentu yang dapat mengakses fitur-fitur sensitif. Hal ini dapat mencegah terjadinya kesalahan atau penyalahgunaan data. Bayangkan sebuah toko baju online sebagai sebuah toko fisik. Kasir mungkin memiliki akses untuk melihat dan memproses transaksi, tapi tidak dapat mengubah harga produk secara langsung—itu adalah tugas dari manajer toko. Role dan permission seperti ini menjaga efisiensi dan keamanan operasional website. 10 Fitur Unggulan Website Toko Baju Online dengan Role dan Permission Sebuah website toko baju online yang baik harus memiliki fitur yang mendukung kelancaran operasional bisnis sekaligus memberikan pengalaman terbaik bagi pengguna. Berikut adalah 10 fitur unggulan yang harus dimiliki beserta contoh role dan permission yang tepat untuk tiap fitur. Manajemen ProdukRole: Admin, Manajer ProdukPermission: Admin dan manajer produk dapat menambahkan, mengedit, dan menghapus produk. Pengguna biasa hanya bisa melihat produk tanpa akses untuk mengubah data.Analogi: Seperti menampilkan etalase toko fisik, hanya pemilik toko dan staf tertentu yang boleh mengubah produk yang ada di etalase.Manajemen TransaksiRole: Kasir, AdminPermission: Kasir dapat memproses transaksi pembelian, namun tidak dapat mengedit data produk atau diskon. Admin memiliki akses penuh terhadap semua transaksi.Analogi: Di sebuah toko fisik, hanya kasir yang bisa memproses pembayaran, tetapi mereka tidak bisa memutuskan harga produk.Manajemen PenggunaRole: Admin, HRPermission: Admin dapat mengelola semua pengguna di sistem (tambah, edit, hapus), sementara HR mungkin hanya dapat melihat atau mengelola profil karyawan.Analogi: Di perusahaan fisik, hanya HR yang bisa mengelola data karyawan, tetapi mungkin tidak semua staf memiliki akses untuk melihat data pribadi mereka.Pengelolaan Diskon dan KuponRole: Manajer Marketing, AdminPermission: Hanya manajer marketing dan admin yang dapat membuat, mengedit, dan menghapus diskon atau kupon. Pengguna biasa hanya bisa menggunakan kupon saat berbelanja.Analogi: Hanya departemen pemasaran yang boleh mengatur promosi di toko, sementara pelanggan hanya bisa memanfaatkan promosi yang tersedia.Laporan PenjualanRole: Admin, Manajer KeuanganPermission: Admin dan manajer keuangan bisa mengakses laporan penjualan dan analitik, sementara kasir mungkin hanya dapat melihat ringkasan penjualan hariannya.Analogi: Dalam sebuah toko, manajer keuangan memiliki akses penuh untuk melihat semua transaksi, sementara kasir hanya dapat melihat transaksi mereka sendiri.Pengaturan WebsiteRole: AdminPermission: Hanya admin yang dapat mengubah pengaturan global website, seperti tampilan, struktur, dan fitur.Analogi: Sama seperti dalam toko fisik, hanya pemilik toko yang berhak untuk merombak desain atau layout toko.Manajemen InventarisRole: Manajer Inventaris, AdminPermission: Manajer inventaris bertanggung jawab untuk menambah atau menghapus stok produk. Kasir tidak memiliki akses ke bagian ini.Analogi: Hanya staf gudang yang dapat mengelola stok di gudang, sementara kasir hanya memproses produk yang tersedia.Manajemen PengirimanRole: Admin, KurirPermission: Admin dapat mengatur semua data pengiriman dan kurir dapat memperbarui status pengiriman. Pengguna biasa hanya dapat melacak status pengiriman mereka.Analogi: Kurir di toko fisik bertugas mengantarkan barang dan memperbarui status pengiriman, tetapi mereka tidak bisa mengubah informasi pesanan.Manajemen Testimoni dan ReviewRole: Admin, PenggunaPermission: Pengguna dapat memberikan review, tetapi hanya admin yang bisa menghapus atau menanggapi review yang melanggar aturan.Analogi: Di dunia nyata, pelanggan dapat memberikan testimoni, tetapi hanya staf yang bertugas yang bisa menghapus atau menanggapi feedback pelanggan.Newsletter dan PromosiRole: Manajer Marketing, AdminPermission: Manajer marketing dan admin dapat mengirimkan newsletter atau promosi kepada pelanggan. Pengguna hanya dapat berlangganan atau berhenti berlangganan.Analogi: Sama seperti di toko fisik, hanya staf pemasaran yang boleh membuat dan mengirim promosi kepada pelanggan. Dengan memahami pembagian role dan permission, kita dapat menciptakan sebuah sistem yang tidak hanya aman, tetapi juga memberikan pengalaman yang lancar dan terstruktur kepada pengguna. Tutorial CRUD Role Permission dengan Laravel 11, Spatie, dan Filament Di tutorial ini, kita akan membahas langkah-langkah untuk membuat CRUD (Create, Read, Update, Delete) data role dan permission di Laravel 11 menggunakan package Spatie dan Filament. Kita juga akan membuat user admin, file seeder, dan resource untuk mengelola data melalui admin panel Filament. 1. Cara Membuat Proyek Laravel 11 Baru dengan Composer Langkah pertama adalah membuat proyek Laravel 11 baru dengan Composer. Berikut caranya: Buat Proyek Laravel 11: Jalankan perintah berikut di terminal untuk membuat proyek Laravel 11 baru: composer create-project laravel/laravel toko-baju "11.*" Setelah selesai, pindah ke direktori proyek: cd toko-baju Instalasi Spatie Permission: Instal package Spatie Permission untuk mengelola role dan permission: composer require spatie/laravel-permission Setelah itu, jalankan perintah berikut untuk mempublikasikan file konfigurasi Spatie: php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider" Lanjutkan dengan menjalankan migrasi untuk membuat tabel role dan permission di database: php artisan migrate Instalasi Filament: Instal package Filament untuk membuat admin panel: composer require filament/filament Setelah terinstal, buat user admin menggunakan command artisan Filament: php artisan make:filament-user 2. Cara Membuat Akun Admin dengan Command Artisan Filament Setelah instalasi selesai, kita dapat membuat user admin untuk mengelola role dan permission di panel admin Filament dengan menggunakan perintah berikut: php artisan make:filament-user Setelah menjalankan perintah ini, Anda akan diminta untuk mengisi informasi seperti nama, email, dan password untuk user admin. Jika Anda ingin memberikan akses penuh, pilih "yes" saat diminta: Is this user a super-admin? (yes/no) [no]: yes Dengan ini, user admin yang dibuat akan memiliki akses penuh ke seluruh fitur admin panel Filament, termasuk pengelolaan data role dan permission. 3. Cara Membuat File Seeder untuk Role dan Permission Setelah membuat user admin, langkah selanjutnya adalah menambahkan data role dan permission ke dalam database. Ini dapat dilakukan dengan membuat file seeder. Berikut adalah langkah-langkahnya: Buat file seeder menggunakan perintah berikut: php artisan make:seeder RolePermissionSeeder Buka file RolePermissionSeeder.php yang berada di direktori database/seeders dan tambahkan kode berikut: use Illuminate\\\\Database\\\\Seeder; use Spatie\\\\Permission\\\\Models\\\\Role; use Spatie\\\\Permission\\\\Models\\\\Permission; class RolePermissionSeeder extends Seeder { public function run() { // Buat permissions $permissions = ['view products', 'edit products', 'delete products', 'view orders', 'manage users']; foreach ($permissions as $permission) { Permission::create(['name' => $permission]); } // Buat role dan assign permissions $adminRole = Role::create(['name' => 'admin']); $adminRole->givePermissionTo($permissions); $managerRole = Role::create(['name' => 'manager']); $managerRole->givePermissionTo(['view products', 'edit products']); $userRole = Role::create(['name' => 'user']); $userRole->givePermissionTo(['view products']); } } Jalankan seeder ini untuk memasukkan data role dan permission ke database: php artisan db:seed --class=RolePermissionSeeder 4. Cara Membuat Filament Resource untuk Mengelola Role dan Permission Langkah selanjutnya adalah membuat resource di Filament untuk mengelola data role dan permission melalui admin panel. Buat Resource Role: Jalankan perintah berikut untuk membuat resource Role: php artisan make:filament-resource Role Ini akan membuat beberapa file di dalam direktori app/Filament/Resources/RoleResource.php. Buat Resource Permission: Jalankan perintah yang sama untuk membuat resource Permission: php artisan make:filament-resource Permission Setelah resource ini dibuat, Anda bisa menyesuaikan pengaturan CRUD yang ada di file RoleResource.php dan PermissionResource.php. 5. Cara Mengatur Form dan Table pada File Resource Filament Untuk mengatur form dan table dalam resource Filament, kita perlu mengedit file resource yang sudah dibuat. Berikut contoh pengaturan form dan table untuk mengelola Role dan Permission: Mengatur Form di RoleResource: Form ini digunakan untuk menambahkan atau mengedit data role. Buka file RoleResource.php dan tambahkan kode berikut di dalam metode form(): public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name') ->required() ->label('Role Name'), MultiSelect::make('permissions') ->relationship('permissions', 'name') ->label('Permissions') ]); } Di sini, kita menggunakan input TextInput untuk nama role dan MultiSelect untuk memilih permission yang terkait dengan role tersebut. Mengatur Table di RoleResource: Table digunakan untuk menampilkan data role yang ada di database. Tambahkan kode berikut di dalam metode table(): public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name')->label('Role Name'), TagsColumn::make('permissions.name')->label('Permissions'), ]) ->filters([ // Anda bisa menambahkan filter di sini ]); } Pada table ini, kita menampilkan kolom name untuk role dan permissions.name untuk menampilkan permission yang dimiliki oleh role tersebut. Cara Mengimplementasikan Role dan Permission pada Navigation dan Routing di web.php dengan Laravel 11, Spatie, dan Filament Setelah kita mengatur role dan permission dengan Spatie dan Filament, langkah penting berikutnya adalah mengimplementasikan logika role dan permission ini dalam navigation (navigasi) dan routing pada file web.php. Ini memastikan bahwa hanya pengguna yang memiliki hak akses tertentu yang dapat melihat dan mengakses fitur tertentu pada website toko baju online kita. 1. Mengimplementasikan Role dan Permission pada Routing di web.php Salah satu cara untuk membatasi akses berdasarkan role atau permission adalah dengan menggunakan middleware. Spatie Permission menyediakan middleware yang memudahkan kita dalam mengatur akses ini. Middleware ini bisa digunakan di file web.php untuk mengatur hak akses pada setiap route. Berikut adalah langkah-langkah untuk mengimplementasikan middleware Spatie di routing: a. Middleware untuk Role Untuk membatasi akses berdasarkan role, kita bisa menggunakan middleware role. Misalnya, hanya pengguna dengan role 'admin' yang bisa mengakses halaman manajemen pengguna: use Illuminate\\\\Support\\\\Facades\\\\Route; Route::middleware(['role:admin'])->group(function () { Route::get('/manage-users', [UserController::class, 'index'])->name('manage.users'); }); Pada contoh ini: Kita menggunakan middleware role:admin untuk memastikan bahwa hanya pengguna dengan role admin yang dapat mengakses route /manage-users.Jika pengguna tanpa role 'admin' mencoba mengakses route ini, mereka akan diarahkan ke halaman 403 (forbidden). b. Middleware untuk Permission Jika Anda ingin lebih spesifik dan membatasi akses berdasarkan permission, gunakan middleware permission. Contoh berikut menunjukkan cara membatasi akses ke halaman pengelolaan produk hanya bagi pengguna yang memiliki permission edit products: Route::middleware(['permission:edit products'])->group(function () { Route::get('/manage-products', [ProductController::class, 'index'])->name('manage.products'); }); Di sini: Middleware permission:edit products hanya mengizinkan pengguna yang memiliki permission untuk mengedit produk mengakses route /manage-products. c. Menggabungkan Middleware Role dan Permission Anda juga bisa menggabungkan role dan permission pada satu route. Misalnya, hanya pengguna dengan role admin yang memiliki permission manage users yang bisa mengakses halaman manajemen pengguna: Route::middleware(['role:admin', 'permission:manage users'])->group(function () { Route::get('/admin/users', [AdminController::class, 'index'])->name('admin.users'); }); Pada contoh ini: Pengguna harus memiliki role admin dan permission manage users untuk bisa mengakses halaman /admin/users. 2. Mengimplementasikan Role dan Permission pada Navigasi Selain di routing, kita juga harus mengatur navigasi di frontend, agar pengguna hanya melihat link atau menu yang sesuai dengan role dan permission mereka. Kita bisa menggunakan helper dari Spatie untuk memeriksa apakah pengguna saat ini memiliki role atau permission tertentu. Berikut adalah beberapa contoh cara implementasinya di Blade template: a. Menampilkan Menu Berdasarkan Role Untuk menampilkan menu atau link hanya untuk pengguna dengan role tertentu, Anda bisa menggunakan direktif Blade berikut: @role('admin') <li><a href="{{ route('manage.users') }}">Manage Users</a></li> @endrole Kode di atas akan memastikan bahwa link "Manage Users" hanya akan ditampilkan jika pengguna memiliki role admin. b. Menampilkan Menu Berdasarkan Permission Jika Anda ingin menampilkan menu atau link berdasarkan permission, gunakan direktif Blade @can yang disediakan oleh Laravel: @can('edit products') <li><a href="{{ route('manage.products') }}">Manage Products</a></li> @endcan Link "Manage Products" hanya akan ditampilkan jika pengguna memiliki permission edit products. c. Menampilkan Menu untuk Multiple Role Jika Anda ingin menampilkan menu atau link untuk beberapa role sekaligus, Anda bisa menggunakan kombinasi logika @role dan @endrole: @role('admin|manager') <li><a href="{{ route('dashboard') }}">Dashboard</a></li> @endrole Pada contoh ini, link "Dashboard" akan ditampilkan jika pengguna memiliki role admin atau manager. 3. Contoh Lengkap Implementasi di web.php Berikut adalah contoh lengkap implementasi role dan permission pada routing di file web.php: use Illuminate\\\\Support\\\\Facades\\\\Route; use App\\\\Http\\\\Controllers\\\\UserController; use App\\\\Http\\\\Controllers\\\\ProductController; use App\\\\Http\\\\Controllers\\\\AdminController; // Route untuk pengguna dengan role admin Route::middleware(['role:admin'])->group(function () { Route::get('/admin/dashboard', [AdminController::class, 'index'])->name('admin.dashboard'); Route::get('/admin/users', [AdminController::class, 'manageUsers'])->name('admin.users'); }); // Route untuk manajemen produk dengan permission 'edit products' Route::middleware(['permission:edit products'])->group(function () { Route::get('/manage-products', [ProductController::class, 'index'])->name('manage.products'); }); // Route untuk mengelola pengguna hanya untuk admin dengan permission 'manage users' Route::middleware(['role:admin', 'permission:manage users'])->group(function () { Route::get('/manage-users', [UserController::class, 'index'])->name('manage.users'); }); Dalam contoh ini: Route /admin/dashboard dan /admin/users hanya dapat diakses oleh pengguna dengan role admin.Route /manage-products hanya dapat diakses oleh pengguna dengan permission edit products.Route /manage-users memerlukan role admin dan permission manage users. Sebagai salah satu framework PHP paling populer, Laravel terus mengalami perkembangan dengan banyak update menarik yang semakin memudahkan developer dalam membangun aplikasi web yang handal dan scalable. Fitur-fitur seperti Spatie Permission, Filament, dan lainnya membuat pengelolaan hak akses menjadi lebih mudah dan efisien. Dengan komunitas yang besar dan dukungan dokumentasi yang kuat, Laravel akan terus menjadi pilihan utama bagi banyak pengembang di seluruh dunia. Untuk mendapatkan lebih banyak pembelajaran dan studi kasus menarik, pastikan untuk memantau terus website BuildWithAngga. Mereka sering meng-update kelas gratis dengan studi kasus yang relevan, disertai mentor berpengalaman yang siap membantu Anda. Dengan akses kelas seumur hidup, Anda dapat belajar kapan saja dan memperdalam skill web development Anda. Jangan lewatkan kesempatan ini untuk meningkatkan kemampuan coding Anda dengan panduan yang terstruktur dan komunitas yang mendukung!

Kelas Tutorial Unit Testing dengan Laravel 11 Pada Projek Toko Obat Online di BuildWithAngga

Tutorial Unit Testing dengan Laravel 11 Pada Projek Toko Obat Online

Unit testing berperan penting dalam pengembangan aplikasi, termasuk dalam projek Toko Obat Online. Salah satu fitur krusial yang perlu diuji adalah Add to Cart. Unit testing memastikan bahwa proses penambahan obat ke keranjang berjalan lancar tanpa ada kesalahan, serta menghindari penambahan stok yang melebihi jumlah stok tersedia. Pada tutorial ini, kita akan melakukan pendekatan yang lebih terstruktur dengan memindahkan logika bisnis ke dalam service layer. Selain itu, kita juga akan melakukan validasi untuk memastikan bahwa stok obat tidak melebihi jumlah yang tersedia. 5 Tips Membuat Unit Testing dengan Laravel 11 1. Pisahkan Logika Bisnis dari Controller Memisahkan logika bisnis dari controller adalah praktik terbaik untuk menjaga agar kode tetap bersih, terstruktur, dan mudah dikelola. Ini membuat controller berfungsi hanya sebagai perantara antara request dari user dan logika bisnis di dalam service. Dengan memindahkan logika bisnis ke service, kita bisa dengan mudah mengelola dan menguji setiap fungsi tanpa terlalu banyak ketergantungan pada flow aplikasi utama. Contoh: Misalnya, kita memiliki fitur Add to Cart. Daripada menulis semua logika di controller, kita pindahkan logika tersebut ke service yang terpisah. Berikut adalah contohnya: // CartService.php <?php namespace App\\\\Services; use App\\\\Models\\\\Obat; use Illuminate\\\\Support\\\\Facades\\\\Session; class CartService { public function addToCart($obatId, $quantity) { $obat = Obat::findOrFail($obatId); $cart = session()->get('cart', []); // Validasi stok yang tersedia if (isset($cart[$obatId])) { $newQuantity = $cart[$obatId]['quantity'] + $quantity; if ($newQuantity > $obat->stok) { throw new \\\\Exception('Jumlah yang diminta melebihi stok tersedia'); } $cart[$obatId]['quantity'] = $newQuantity; } else { if ($quantity > $obat->stok) { throw new \\\\Exception('Jumlah yang diminta melebihi stok tersedia'); } $cart[$obatId] = [ 'nama_obat' => $obat->nama_obat, 'harga' => $obat->harga, 'quantity' => $quantity, ]; } session()->put('cart', $cart); return $cart; } } Pada controller, kita hanya perlu memanggil service ini tanpa memasukkan logika bisnis: // CartController.php <?php namespace App\\\\Http\\\\Controllers; use App\\\\Services\\\\CartService; use Illuminate\\\\Http\\\\Request; class CartController extends Controller { protected $cartService; public function __construct(CartService $cartService) { $this->cartService = $cartService; } public function addToCart(Request $request, $id) { $validated = $request->validate([ 'quantity' => 'required|integer|min=1', ]); try { $this->cartService->addToCart($id, $validated['quantity']); return response()->json(['message' => 'Obat berhasil ditambahkan ke keranjang']); } catch (\\\\Exception $e) { return response()->json(['error' => $e->getMessage()], 400); } } } Dengan ini, controller menjadi lebih ringkas dan hanya fokus pada request handling. 2. Gunakan Factory untuk Data Palsu Factory memungkinkan kita untuk membuat data uji dengan mudah, sehingga kita tidak perlu membuat data secara manual dalam setiap tes. Factory memudahkan pembuatan data seperti obat, pengguna, dan transaksi, yang membantu kita memastikan tes berjalan dengan data yang mirip dengan skenario nyata. Contoh: php artisan make:factory ObatFactory --model=Obat Kemudian, buat factory untuk model Obat: // database/factories/ObatFactory.php <?php namespace Database\\\\Factories; use App\\\\Models\\\\Obat; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\Factory; class ObatFactory extends Factory { protected $model = Obat::class; public function definition() { return [ 'nama_obat' => $this->faker->word(), 'harga' => $this->faker->numberBetween(1000, 50000), 'stok' => $this->faker->numberBetween(1, 100), ]; } } Dengan factory ini, kita bisa membuat data obat dengan mudah di dalam tes: $obat = Obat::factory()->create([ 'stok' => 10, ]); 3. Validasi Data dengan Baik Validasi input sangat penting, terutama saat menangani stok atau jumlah barang. Pastikan data yang diterima valid dan tidak menimbulkan error yang bisa menyebabkan kerugian bisnis. Contoh: Dalam controller kita, lakukan validasi pada jumlah obat yang dimasukkan ke dalam keranjang: $validated = $request->validate([ 'quantity' => 'required|integer|min=1', ]); Kita juga bisa melakukan validasi tambahan di dalam service, misalnya mengecek apakah jumlah yang diminta melebihi stok yang tersedia: if ($newQuantity > $obat->stok) { throw new \\\\Exception('Jumlah yang diminta melebihi stok tersedia'); } 4. Sederhanakan Unit Testing Sederhanakan setiap unit test dengan memfokuskan pada satu fungsi kecil atau satu skenario. Jangan mencoba menguji beberapa hal sekaligus dalam satu tes karena itu bisa menyulitkan debugging jika terjadi kesalahan. Contoh: Untuk fitur Add to Cart, kita bisa membuat dua tes yang terpisah: satu untuk memastikan obat berhasil ditambahkan ke keranjang, dan satu lagi untuk memastikan stok tidak melebihi yang tersedia. // tests/Feature/CartTest.php public function test_add_to_cart_success() { $obat = Obat::factory()->create(['stok' => 10]); $response = $this->postJson('/cart/add/'.$obat->id, ['quantity' => 5]); $response->assertStatus(200); $this->assertEquals(session('cart')[$obat->id]['quantity'], 5); } public function test_add_to_cart_exceeds_stock() { $obat = Obat::factory()->create(['stok' => 5]); $response = $this->postJson('/cart/add/'.$obat->id, ['quantity' => 6]); $response->assertStatus(400); $response->assertJson(['error' => 'Jumlah yang diminta melebihi stok tersedia']); } 5. Gunakan Database Transaksi untuk Isolasi Test Laravel menyediakan fitur RefreshDatabase yang akan membersihkan dan mereset database setiap kali kita menjalankan tes. Ini memastikan bahwa tes tidak saling bergantung pada data yang tersisa dari tes sebelumnya, menjaga tes tetap independen dan hasilnya akurat. Contoh: // tests/Feature/CartTest.php use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; class CartTest extends TestCase { use RefreshDatabase; public function test_add_to_cart_success() { // Tes dengan refresh database } } Dengan menggunakan RefreshDatabase, setiap tes dimulai dengan kondisi database yang bersih, sehingga tidak ada data yang tertinggal dari tes sebelumnya yang dapat mempengaruhi hasil tes. 5 Fitur Utama yang Perlu Dibuat Unit Testing pada Projek Toko Obat Online Add to Cart Tes untuk memastikan obat berhasil ditambahkan ke dalam keranjang tanpa melebihi jumlah stok.Proses Checkout Tes untuk memastikan pengguna bisa melakukan checkout dengan informasi yang benar.Manajemen Stok Obat Tes memastikan stok obat berkurang sesuai dengan transaksi yang dilakukan.Autentikasi Pengguna Tes untuk memastikan bahwa hanya pengguna terdaftar yang bisa mengakses fitur tertentu.Notifikasi Transaksi Tes untuk memastikan notifikasi dikirimkan setelah transaksi berhasil. Tata Cara Melakukan Unit Testing pada Fitur Add to Cart Berikut adalah langkah-langkah detail untuk membuat unit test pada fitur Add to Cart. Kita akan menggunakan service untuk menangani logika bisnis, memastikan validasi stok, dan membuat factory untuk data obat. 1. Membuat Factory untuk Model Obat Langkah pertama adalah membuat factory untuk menghasilkan data obat palsu dalam jumlah banyak. Factory ini akan digunakan dalam unit testing. php artisan make:factory ObatFactory --model=Obat Buka file database/factories/ObatFactory.php, dan tambahkan konfigurasi berikut: <?php namespace Database\\\\Factories; use App\\\\Models\\\\Obat; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\Factory; class ObatFactory extends Factory { protected $model = Obat::class; public function definition() { return [ 'nama_obat' => $this->faker->word(), 'harga' => $this->faker->numberBetween(1000, 100000), 'stok' => $this->faker->numberBetween(1, 50), ]; } } 2. Membuat Service untuk Logika Add to Cart Logika bisnis untuk fitur Add to Cart akan dipindahkan ke dalam service agar lebih mudah di-maintain. Service ini akan menangani validasi dan penambahan obat ke dalam keranjang. Pertama, buat service dengan nama CartService. php artisan make:service CartService Lalu, tambahkan logika di dalam service ini. <?php namespace App\\\\Services; use App\\\\Models\\\\Obat; use Illuminate\\\\Support\\\\Facades\\\\Session; class CartService { public function addToCart($obatId, $quantity) { $obat = Obat::findOrFail($obatId); $cart = session()->get('cart', []); // Cek apakah stok mencukupi if (isset($cart[$obatId])) { $newQuantity = $cart[$obatId]['quantity'] + $quantity; if ($newQuantity > $obat->stok) { throw new \\\\Exception('Jumlah yang diminta melebihi stok tersedia'); } $cart[$obatId]['quantity'] = $newQuantity; } else { if ($quantity > $obat->stok) { throw new \\\\Exception('Jumlah yang diminta melebihi stok tersedia'); } $cart[$obatId] = [ 'nama_obat' => $obat->nama_obat, 'harga' => $obat->harga, 'quantity' => $quantity, ]; } session()->put('cart', $cart); return $cart; } } 3. Membuat Controller untuk Menghubungkan ke Service Selanjutnya, kita akan membuat controller untuk menghubungkan request dari pengguna dengan service. php artisan make:controller CartController Di dalam CartController.php, tambahkan logika berikut: <?php namespace App\\\\Http\\\\Controllers; use App\\\\Services\\\\CartService; use Illuminate\\\\Http\\\\Request; class CartController extends Controller { protected $cartService; public function __construct(CartService $cartService) { $this->cartService = $cartService; } public function addToCart(Request $request, $id) { $validated = $request->validate([ 'quantity' => 'required|integer|min=1', ]); try { $this->cartService->addToCart($id, $validated['quantity']); return response()->json(['message' => 'Obat berhasil ditambahkan ke keranjang']); } catch (\\\\Exception $e) { return response()->json(['error' => $e->getMessage()], 400); } } } 4. Membuat Unit Test untuk Fitur Add to Cart Langkah terakhir adalah membuat unit test untuk menguji fitur Add to Cart. Kita akan menguji apakah obat berhasil ditambahkan dan stoknya tidak melebihi yang tersedia. php artisan make:test CartTest Di dalam tests/Feature/CartTest.php, tambahkan logika berikut: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Obat; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class CartTest extends TestCase { use RefreshDatabase; public function test_add_to_cart_success() { // Buat data obat dengan factory $obat = Obat::factory()->create([ 'stok' => 10, ]); // Simulasi penambahan obat ke dalam keranjang dengan quantity 5 $response = $this->postJson('/cart/add/'.$obat->id, [ 'quantity' => 5, ]); // Cek respon berhasil $response->assertStatus(200); // Cek apakah obat ditambahkan ke session $this->assertEquals(session('cart')[$obat->id]['quantity'], 5); } public function test_add_to_cart_exceeds_stock() { // Buat data obat dengan stok terbatas $obat = Obat::factory()->create([ 'stok' => 5, ]); // Simulasi penambahan obat dengan quantity yang melebihi stok $response = $this->postJson('/cart/add/'.$obat->id, [ 'quantity' => 6, ]); // Cek apakah respon error karena stok tidak mencukupi $response->assertStatus(400); $response->assertJson(['error' => 'Jumlah yang diminta melebihi stok tersedia']); } } Tes di atas memeriksa dua skenario: Penambahan obat ke keranjang dengan jumlah yang valid (stok mencukupi).Penambahan obat ke keranjang dengan jumlah yang melebihi stok, yang harus memicu error. Jalankan tes menggunakan perintah: php artisan test Kesimpulan Laravel terus menjadi salah satu framework PHP paling populer di kalangan developer, dan popularitasnya akan terus meningkat karena Laravel selalu memberikan update yang menarik. Setiap versi baru membawa fitur-fitur yang memudahkan pekerjaan developer, seperti integrasi dengan alat testing, pengelolaan database yang lebih efisien, serta berbagai peningkatan performa dan keamanan. Semua ini menjadikan Laravel sebagai pilihan yang tepat untuk membangun aplikasi web modern. Bagi kamu yang ingin terus mengikuti perkembangan terbaru dari Laravel, pastikan untuk selalu memantau website BuildWithAngga. Mereka sering kali meng-update kelas-kelas gratis yang dilengkapi dengan studi kasus menarik, sehingga kamu bisa belajar langsung dari pengalaman nyata. Tidak hanya itu, setiap kelas juga dipandu oleh mentor-mentor berpengalaman yang siap membantu kamu dalam proses belajar. Ditambah lagi, kamu mendapatkan akses ke kelas tersebut seumur hidup, jadi kamu bisa belajar kapan saja tanpa batas waktu. Terus tingkatkan kemampuan coding-mu bersama BuildWithAngga dan jadilah developer yang siap menghadapi tantangan teknologi masa depan!

Kelas Tutorial CRUD Laravel 11, MySQL 8, Breeze Bikin Projek Website Jual Beli Mobil di BuildWithAngga

Tutorial CRUD Laravel 11, MySQL 8, Breeze Bikin Projek Website Jual Beli Mobil

Pada kesempatan kali ini, kita akan belajar membuat sebuah website jual beli mobil menggunakan Laravel 11, MySQL 8, dan Laravel Breeze. Proyek ini akan disertai dengan beberapa fitur utama seperti CRUD (Create, Read, Update, Delete) untuk mengelola data mobil, transaksi, dan pelanggan. Fitur CRUD sangat penting dalam sebuah website, terutama untuk mengelola data-data yang dinamis seperti produk yang dijual, pelanggan, serta transaksi yang terjadi. Mari kita bahas langkah-langkahnya secara lengkap. Pentingnya Fitur CRUD CRUD merupakan fitur dasar yang harus ada dalam hampir setiap website dinamis. Dengan fitur CRUD, pengguna website dapat: Create: Menambahkan data baru, seperti menambahkan mobil yang akan dijual.Read: Menampilkan data yang ada, misalnya melihat daftar mobil yang dijual.Update: Mengubah data, seperti mengedit informasi mobil atau transaksi.Delete: Menghapus data yang tidak diperlukan lagi, misalnya menghapus mobil yang sudah terjual. Tanpa fitur CRUD, website tidak akan bisa mengelola data dengan baik, dan pengguna akan kesulitan berinteraksi dengan sistem. Inilah alasan mengapa kita perlu membangun CRUD untuk website jual beli mobil ini. Langkah Awal: Install PHP, MySQL, XAMPP, Composer Sebelum kita mulai, pastikan Anda sudah menginstall beberapa software penting, yaitu PHP, MySQL, XAMPP, dan Composer. Software ini diperlukan untuk menjalankan Laravel dan membuat koneksi ke database. Berikut langkah-langkah instalasi: Download PHP: Kunjungi situs resmi PHP di php.net dan download versi PHP terbaru. Ikuti instruksi instalasi sesuai sistem operasi Anda.Download MySQL: Untuk database, Anda bisa mendownload MySQL dari mysql.com. Pilih versi MySQL 8 dan ikuti instruksi instalasinya.Download XAMPP: XAMPP memudahkan kita dalam menjalankan server lokal. Download XAMPP dari apachefriends.org dan pastikan MySQL dan Apache sudah berjalan setelah instalasi.Install Composer: Composer adalah dependency manager untuk PHP yang digunakan untuk menginstall Laravel. Download Composer dari getcomposer.org. Setelah instalasi, pastikan Composer dapat dijalankan melalui terminal dengan mengetikkan perintah composer di command line. Setelah semua software terinstall, kita siap untuk memulai proyek Laravel. 1. Membuat Projek Laravel 11 dengan Composer Langkah pertama adalah membuat projek Laravel terbaru. Buka terminal atau command prompt, lalu jalankan perintah berikut: composer create-project laravel/laravel jual-beli-mobil Perintah ini akan membuat folder proyek baru bernama jual-beli-mobil dengan versi Laravel terbaru, yaitu Laravel 11. 2. Mengatur Database Connection Setelah proyek berhasil dibuat, kita perlu menghubungkan Laravel dengan MySQL. Buka file .env di folder proyek Anda dan sesuaikan pengaturan database sesuai dengan konfigurasi MySQL Anda. Contoh: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=jualbelimobil DB_USERNAME=root DB_PASSWORD= Pastikan MySQL sudah berjalan melalui XAMPP, dan database jualbelimobil telah dibuat di phpMyAdmin. 3. Membuat Migration dan Model Selanjutnya, kita akan membuat tabel dan model untuk products, categories, customers, dan transactions. Jalankan perintah berikut untuk membuat migration dan model sekaligus: php artisan make:model Product -m php artisan make:model Category -m php artisan make:model Customer -m php artisan make:model Transaction -m Setiap perintah di atas akan membuat file migration dan model yang akan kita gunakan untuk mengatur struktur tabel dan hubungan antar data. 4. Mengatur Fields pada Schema Migration Secara Detail Setelah kita membuat file migration dan model untuk masing-masing tabel seperti products, categories, customers, dan transactions, langkah berikutnya adalah mengatur struktur tabel (schema) di dalam file migration tersebut. Setiap file migration ini terletak di dalam folder database/migrations. Mari kita lihat bagaimana kita bisa mengatur schema untuk setiap tabel dengan lengkap dan detail: Tabel Products Buka file migration untuk tabel products yang biasanya memiliki nama seperti create_products_table.php. Di dalam file ini, kita bisa mengatur kolom-kolom yang dibutuhkan untuk menyimpan informasi produk mobil, seperti nama, deskripsi, harga, dan kategori produk. Contoh lengkap untuk schema tabel products: Schema::create('products', function (Blueprint $table) { $table->id(); // Kolom ID unik untuk setiap produk $table->string('name'); // Nama produk, tipe data string $table->text('description'); // Deskripsi produk, tipe data text $table->decimal('price', 10, 2); // Harga produk, tipe data decimal dengan 10 digit total dan 2 digit setelah koma $table->unsignedBigInteger('category_id'); // ID dari kategori produk, tipe data unsignedBigInteger $table->timestamps(); // Kolom untuk mencatat waktu pembuatan dan perubahan data // Relasi antara produk dan kategori (Foreign Key) $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); }); Penjelasan: $table->id(): Menambahkan kolom ID utama (primary key) dengan tipe big integer secara otomatis.$table->string('name'): Menambahkan kolom name untuk menyimpan nama produk dengan tipe data string.$table->text('description'): Menambahkan kolom description untuk menyimpan deskripsi produk dengan tipe text.$table->decimal('price', 10, 2): Menambahkan kolom price dengan tipe decimal untuk menyimpan harga produk. Kolom ini memiliki 10 digit angka total dan 2 digit angka desimal.$table->unsignedBigInteger('category_id'): Kolom category_id digunakan untuk menyimpan ID dari tabel categories sebagai foreign key.$table->timestamps(): Laravel secara otomatis akan membuat kolom created_at dan updated_at.$table->foreign('category_id'): Mendefinisikan relasi foreign key antara tabel products dan categories. Ketika kategori dihapus, produk terkait akan ikut dihapus karena menggunakan onDelete('cascade'). Tabel Categories Buka file migration untuk tabel categories. Di dalam file ini, kita akan mengatur struktur tabel yang menyimpan data kategori dari produk yang dijual. Contoh lengkap untuk schema tabel categories: Schema::create('categories', function (Blueprint $table) { $table->id(); // Kolom ID unik untuk setiap kategori $table->string('name'); // Nama kategori, tipe data string $table->text('description')->nullable(); // Deskripsi kategori, opsional, tipe data text $table->timestamps(); // Kolom untuk mencatat waktu pembuatan dan perubahan data }); Penjelasan: $table->id(): Menambahkan kolom ID utama untuk setiap kategori.$table->string('name'): Kolom name digunakan untuk menyimpan nama kategori.$table->text('description')->nullable(): Kolom description bersifat opsional (nullable), digunakan untuk menyimpan deskripsi kategori.$table->timestamps(): Menambahkan kolom created_at dan updated_at untuk menyimpan waktu pembuatan dan update kategori. Tabel Customers Selanjutnya, kita akan mengatur file migration untuk tabel customers yang menyimpan data pelanggan. Contoh lengkap untuk schema tabel customers: Schema::create('customers', function (Blueprint $table) { $table->id(); // Kolom ID unik untuk setiap customer $table->string('name'); // Nama customer, tipe data string $table->string('email')->unique(); // Email customer, tipe data string, harus unik $table->string('phone'); // Nomor telepon customer, tipe data string $table->text('address'); // Alamat customer, tipe data text $table->timestamps(); // Kolom untuk mencatat waktu pembuatan dan perubahan data }); Penjelasan: $table->id(): Menambahkan kolom ID utama untuk setiap customer.$table->string('name'): Kolom name digunakan untuk menyimpan nama pelanggan.$table->string('email')->unique(): Kolom email digunakan untuk menyimpan email pelanggan dan harus unik.$table->string('phone'): Kolom phone digunakan untuk menyimpan nomor telepon pelanggan.$table->text('address'): Kolom address digunakan untuk menyimpan alamat pelanggan.$table->timestamps(): Menambahkan kolom created_at dan updated_at. Tabel Transactions Terakhir, kita akan membuat schema untuk tabel transactions yang menyimpan informasi transaksi jual beli mobil. Contoh lengkap untuk schema tabel transactions: Schema::create('transactions', function (Blueprint $table) { $table->id(); // Kolom ID unik untuk setiap transaksi $table->unsignedBigInteger('customer_id'); // ID dari customer yang melakukan transaksi $table->unsignedBigInteger('product_id'); // ID dari produk yang dibeli $table->decimal('total_price', 10, 2); // Total harga transaksi, tipe data decimal $table->date('transaction_date'); // Tanggal transaksi, tipe data date $table->timestamps(); // Kolom untuk mencatat waktu pembuatan dan perubahan data // Relasi ke tabel customers dan products $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade'); $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); }); Penjelasan: $table->id(): Menambahkan kolom ID unik untuk setiap transaksi.$table->unsignedBigInteger('customer_id'): Kolom untuk menyimpan ID pelanggan dari tabel customers.$table->unsignedBigInteger('product_id'): Kolom untuk menyimpan ID produk dari tabel products.$table->decimal('total_price', 10, 2): Kolom total_price digunakan untuk menyimpan total harga transaksi.$table->date('transaction_date'): Kolom transaction_date digunakan untuk menyimpan tanggal transaksi.$table->timestamps(): Menambahkan kolom created_at dan updated_at.$table->foreign('customer_id'): Relasi ke tabel customers dengan menggunakan foreign key.$table->foreign('product_id'): Relasi ke tabel products dengan menggunakan foreign key. 5. Mengatur Mass Assignment dan Relationship dengan Detail pada Seluruh File Model Setelah kita selesai membuat tabel dengan schema yang tepat di dalam file migration, langkah selanjutnya adalah mengatur mass assignment dan relationship di setiap model. Bagian ini sangat penting untuk memastikan data dapat dimasukkan secara aman ke dalam tabel melalui Laravel ORM (Eloquent), dan hubungan antar tabel dikelola dengan benar. Berikut adalah langkah-langkah pengaturan mass assignment dan relationship untuk setiap model yang telah kita buat, yaitu Product, Category, Customer, dan Transaction. Mass Assignment Mass assignment dalam Laravel memungkinkan kita mengisi kolom-kolom tertentu secara massal dalam satu waktu menggunakan array. Namun, ini bisa menjadi celah keamanan jika kita tidak hati-hati dalam menentukan kolom mana saja yang boleh diisi secara massal. Untuk mencegah mass assignment vulnerability, kita menggunakan properti $fillable dalam model. Berikut adalah pengaturan mass assignment untuk setiap model. Model Product Buka file model Product yang terletak di folder app/Models/Product.php. Pada model ini, kita akan menambahkan properti $fillable untuk menentukan kolom-kolom yang boleh diisi secara massal, yaitu name, description, price, dan category_id. namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Product extends Model { // Kolom yang boleh diisi secara massal protected $fillable = ['name', 'description', 'price', 'category_id']; // Relasi ke tabel categories public function category() { return $this->belongsTo(Category::class); } // Relasi ke tabel transactions public function transactions() { return $this->hasMany(Transaction::class); } } Penjelasan: $fillable: Kolom-kolom ini dapat diisi ketika kita menggunakan metode seperti create() atau update() dengan array data.category(): Relasi belongsTo menghubungkan produk dengan kategori. Satu produk hanya memiliki satu kategori.transactions(): Relasi hasMany menghubungkan produk dengan banyak transaksi. Satu produk bisa dijual di beberapa transaksi. Model Category Selanjutnya, buka file model Category yang terletak di app/Models/Category.php. Model ini juga perlu diatur dengan $fillable dan relasi ke model Product. namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Category extends Model { // Kolom yang boleh diisi secara massal protected $fillable = ['name', 'description']; // Relasi ke tabel products public function products() { return $this->hasMany(Product::class); } } Penjelasan: $fillable: Kolom-kolom yang boleh diisi adalah name dan description.products(): Relasi hasMany menunjukkan bahwa satu kategori bisa memiliki banyak produk. Model Customer Buka file model Customer yang terletak di app/Models/Customer.php. Pada model ini, kita akan mengatur $fillable untuk kolom name, email, phone, dan address, serta menghubungkan customer dengan transaksi melalui relasi hasMany. namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Customer extends Model { // Kolom yang boleh diisi secara massal protected $fillable = ['name', 'email', 'phone', 'address']; // Relasi ke tabel transactions public function transactions() { return $this->hasMany(Transaction::class); } } Penjelasan: $fillable: Kolom-kolom yang dapat diisi adalah name, email, phone, dan address.transactions(): Relasi hasMany menunjukkan bahwa satu customer bisa melakukan banyak transaksi. Model Transaction Terakhir, buka file model Transaction yang terletak di app/Models/Transaction.php. Model ini akan dihubungkan dengan Customer dan Product menggunakan belongsTo, dan kita juga akan mengatur $fillable untuk kolom customer_id, product_id, total_price, dan transaction_date. namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Transaction extends Model { // Kolom yang boleh diisi secara massal protected $fillable = ['customer_id', 'product_id', 'total_price', 'transaction_date']; // Relasi ke tabel customers public function customer() { return $this->belongsTo(Customer::class); } // Relasi ke tabel products public function product() { return $this->belongsTo(Product::class); } } Penjelasan: $fillable: Kolom-kolom yang dapat diisi secara massal adalah customer_id, product_id, total_price, dan transaction_date.customer(): Relasi belongsTo menghubungkan transaksi dengan pelanggan yang melakukan transaksi. Satu transaksi hanya dilakukan oleh satu pelanggan.product(): Relasi belongsTo menghubungkan transaksi dengan produk yang dibeli. Satu transaksi hanya mencakup satu produk. 6. Menginstall Laravel Breeze Secara Detail Pada tahap ini, kita akan membuat fitur login untuk admin website jual beli mobil menggunakan Laravel Breeze. Laravel Breeze adalah starter kit yang menyediakan implementasi autentikasi sederhana dengan login, registrasi, verifikasi email, reset password, dan logout. Selain itu, Laravel Breeze sudah terintegrasi dengan Blade dan Tailwind CSS sehingga memudahkan kita dalam membangun UI untuk fitur autentikasi. Berikut adalah langkah-langkah detail untuk menginstall dan mengkonfigurasi Laravel Breeze pada proyek Laravel 11 kita. Langkah 1: Install Laravel Breeze Pertama, kita perlu menambahkan Laravel Breeze ke dalam proyek Laravel menggunakan Composer. Composer akan mengelola dependensi dan menginstall Laravel Breeze secara otomatis. Buka terminal atau command prompt di direktori proyek Laravel Anda. Jalankan perintah berikut untuk menginstall Laravel Breeze: composer require laravel/breeze --dev Perintah ini akan mengunduh dan menginstall Laravel Breeze ke dalam proyek. Opsi --dev menandakan bahwa Breeze hanya diinstall di environment pengembangan (development), dan tidak dibutuhkan di environment produksi (production). Langkah 2: Menginstall Breeze Setelah Laravel Breeze berhasil diinstall, langkah berikutnya adalah menjalankan perintah untuk meng-setup Breeze dalam proyek Laravel kita. Perintah ini akan mengatur file-file terkait autentikasi seperti login, registrasi, dan lainnya. Jalankan perintah berikut di terminal: php artisan breeze:install Perintah ini akan menghasilkan beberapa file dan folder baru, antara lain: File Blade untuk halaman login, registrasi, dan dashboard yang terletak di folder resources/views/auth dan resources/views/dashboard.blade.php.Controller untuk menangani proses autentikasi di folder app/Http/Controllers/Auth.Routes yang terletak di routes/web.php sudah otomatis terisi dengan rute-rute untuk login, registrasi, dan dashboard. Breeze menyediakan implementasi autentikasi dasar yang siap digunakan dan sudah terintegrasi dengan Tailwind CSS sebagai framework CSS-nya. Langkah 3: Menginstall Dependency Frontend Setelah menjalankan instalasi Laravel Breeze, langkah berikutnya adalah menginstall dependency frontend untuk memastikan Tailwind CSS dan semua asset frontend lainnya berfungsi dengan baik. Jalankan perintah berikut: npm install Perintah ini akan mengunduh dan menginstall semua package frontend yang diperlukan oleh Laravel Breeze. Proses ini menggunakan npm (Node Package Manager) untuk mengelola package JavaScript dan CSS yang dibutuhkan oleh proyek. Setelah semua dependency terinstall, Anda harus melakukan build asset frontend agar semua file CSS dan JavaScript siap digunakan. Jalankan perintah berikut: npm run dev Perintah ini akan melakukan compile terhadap semua file CSS dan JavaScript, kemudian meletakkannya di folder public agar bisa diakses oleh browser. Langkah 4: Menjalankan Migrasi Database Laravel Breeze juga menyediakan tabel user untuk menyimpan data pengguna seperti admin, pelanggan, atau siapa pun yang akan menggunakan sistem autentikasi. Sebelum kita bisa menggunakan fitur login dan registrasi, kita harus membuat tabel pengguna ini di dalam database. Untuk itu, jalankan perintah migrasi berikut: php artisan migrate Perintah ini akan membuat beberapa tabel di dalam database, antara lain: users: Tabel ini menyimpan informasi dasar tentang pengguna seperti nama, email, password, dan timestamps.password_resets: Tabel ini digunakan untuk menyimpan token yang diperlukan saat pengguna ingin mereset password mereka.failed_jobs dan personal_access_tokens: Tabel ini dibutuhkan untuk manajemen job dan token akses pribadi. Setelah perintah ini dijalankan, tabel-tabel tersebut akan dibuat di dalam database yang sudah kita hubungkan sebelumnya di file .env. Langkah 5: Konfigurasi Authentication (Opsional) Jika diperlukan, Anda dapat mengkonfigurasi berbagai aspek autentikasi yang digunakan oleh Laravel Breeze, seperti redirect setelah login, halaman dashboard, atau middleware yang digunakan untuk memproteksi rute-rute tertentu. Konfigurasi autentikasi terletak di file config/auth.php. Di sini, Anda bisa mengubah pengaturan seperti guard yang digunakan atau provider untuk autentikasi pengguna. Contoh: Jika Anda ingin mengubah halaman dashboard setelah login, Anda dapat menyesuaikan route di HomeController atau langsung di dalam web.php seperti berikut: Route::get('/dashboard', function () { return view('dashboard'); })->middleware(['auth'])->name('dashboard'); Langkah 6: Menguji Fitur Login dan Registrasi Sekarang kita sudah berhasil menginstall dan mengkonfigurasi Laravel Breeze beserta dependensi frontend-nya. Untuk menguji apakah fitur login dan registrasi berfungsi dengan baik, jalankan server Laravel dengan perintah: php artisan serve Akses aplikasi melalui browser di alamat http://127.0.0.1:8000, dan Anda akan melihat halaman utama dari Laravel. Untuk mengakses halaman login atau registrasi, buka URL berikut: Login: http://127.0.0.1:8000/loginRegistrasi: http://127.0.0.1:8000/register Coba daftarkan akun baru melalui halaman registrasi, kemudian login dengan akun tersebut. Setelah berhasil login, Anda akan diarahkan ke halaman dashboard yang sudah disediakan oleh Breeze. 7. Membuat File Blade untuk Menambahkan dan Menampilkan Data Setelah kita membuat tabel dan model, serta mengatur mass assignment dan relationship, langkah berikutnya adalah membuat file Blade di folder resources/views. File Blade ini akan digunakan untuk menampilkan antarmuka halaman admin, di mana admin bisa menambahkan, mengedit, melihat, dan menghapus data produk. Kita akan membuat beberapa file Blade yang akan digunakan untuk: Menampilkan formulir untuk menambahkan produk baru (Create).Menampilkan daftar produk yang sudah ditambahkan (Read).Mengedit produk yang sudah ada (Update).Menghapus produk (Delete). Berikut ini adalah detail dan koding untuk setiap file Blade yang diperlukan. 1. Membuat Formulir Menambahkan Produk Baru (Create) Buat file baru bernama create.blade.php di dalam folder resources/views/products/. File ini akan menampilkan formulir yang digunakan untuk menambahkan produk baru ke dalam database. Kode lengkap untuk file create.blade.php: @extends('layouts.app') @section('content') <div class="container"> <h1>Tambah Produk Baru</h1> <!-- Menampilkan error validasi jika ada --> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <!-- Form untuk menambahkan produk baru --> <form method="POST" action="{{ route('products.store') }}"> @csrf <div class="mb-3"> <label for="name" class="form-label">Nama Produk</label> <input type="text" class="form-control" id="name" name="name" value="{{ old('name') }}" required> </div> <div class="mb-3"> <label for="description" class="form-label">Deskripsi Produk</label> <textarea class="form-control" id="description" name="description" required>{{ old('description') }}</textarea> </div> <div class="mb-3"> <label for="price" class="form-label">Harga Produk</label> <input type="number" class="form-control" id="price" name="price" value="{{ old('price') }}" step="0.01" required> </div> <div class="mb-3"> <label for="category_id" class="form-label">Kategori Produk</label> <select class="form-control" id="category_id" name="category_id" required> <option value="">-- Pilih Kategori --</option> @foreach($categories as $category) <option value="{{ $category->id }}" {{ old('category_id') == $category->id ? 'selected' : '' }}> {{ $category->name }} </option> @endforeach </select> </div> <button type="submit" class="btn btn-primary">Simpan</button> </form> </div> @endsection Penjelasan: @extends('layouts.app'): Menandakan bahwa file Blade ini menggunakan layout utama yang terletak di layouts/app.blade.php.@csrf: Token CSRF (Cross-Site Request Forgery) untuk mencegah serangan keamanan.old('field_name'): Mengambil input yang sebelumnya diisi jika terjadi validasi error.$errors: Menampilkan error jika ada masalah validasi. 2. Menampilkan Daftar Produk (Read) Selanjutnya, kita perlu membuat halaman untuk menampilkan daftar produk yang sudah ada. Buat file baru bernama index.blade.php di dalam folder resources/views/products/. Kode lengkap untuk file index.blade.php: @extends('layouts.app') @section('content') <div class="container"> <h1>Daftar Produk</h1> <!-- Tombol untuk menambahkan produk baru --> <a href="{{ route('products.create') }}" class="btn btn-success mb-3">Tambah Produk Baru</a> <!-- Menampilkan pesan sukses jika ada --> @if(session('success')) <div class="alert alert-success"> {{ session('success') }} </div> @endif <!-- Menampilkan tabel daftar produk --> <table class="table table-bordered"> <thead> <tr> <th>Nama Produk</th> <th>Deskripsi</th> <th>Harga</th> <th>Kategori</th> <th>Aksi</th> </tr> </thead> <tbody> @foreach($products as $product) <tr> <td>{{ $product->name }}</td> <td>{{ $product->description }}</td> <td>{{ $product->price }}</td> <td>{{ $product->category->name }}</td> <td> <a href="{{ route('products.edit', $product->id) }}" class="btn btn-warning">Edit</a> <form action="{{ route('products.destroy', $product->id) }}" method="POST" style="display:inline;"> @csrf @method('DELETE') <button type="submit" class="btn btn-danger" onclick="return confirm('Apakah Anda yakin ingin menghapus produk ini?')">Hapus</button> </form> </td> </tr> @endforeach </tbody> </table> <!-- Menampilkan pagination --> {{ $products->links() }} </div> @endsection Penjelasan: @foreach($products as $product): Looping melalui daftar produk yang diterima dari controller.$product->category->name: Menampilkan nama kategori dari produk. Ini bekerja karena kita sudah mengatur relasi belongsTo pada model Product.@method('DELETE'): Digunakan untuk mengirimkan request DELETE untuk menghapus produk.$products->links(): Menampilkan pagination untuk memecah daftar produk jika terlalu panjang. 3. Mengedit Produk (Update) Untuk mengedit produk yang sudah ada, kita perlu membuat file edit.blade.php. File ini hampir mirip dengan create.blade.php, tetapi form-nya sudah terisi dengan data produk yang akan di-edit. Kode lengkap untuk file edit.blade.php: @extends('layouts.app') @section('content') <div class="container"> <h1>Edit Produk</h1> <!-- Menampilkan error validasi jika ada --> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <!-- Form untuk mengedit produk --> <form method="POST" action="{{ route('products.update', $product->id) }}"> @csrf @method('PUT') <div class="mb-3"> <label for="name" class="form-label">Nama Produk</label> <input type="text" class="form-control" id="name" name="name" value="{{ $product->name }}" required> </div> <div class="mb-3"> <label for="description" class="form-label">Deskripsi Produk</label> <textarea class="form-control" id="description" name="description" required>{{ $product->description }}</textarea> </div> <div class="mb-3"> <label for="price" class="form-label">Harga Produk</label> <input type="number" class="form-control" id="price" name="price" value="{{ $product->price }}" step="0.01" required> </div> <div class="mb-3"> <label for="category_id" class="form-label">Kategori Produk</label> <select class="form-control" id="category_id" name="category_id" required> <option value="">-- Pilih Kategori --</option> @foreach($categories as $category) <option value="{{ $category->id }}" {{ $product->category_id == $category->id ? 'selected' : '' }}> {{ $category->name }} </option> @endforeach </select> </div> <button type="submit" class="btn btn-primary">Update</button> </form> </div> @endsection Penjelasan: value="{{ $product->name }}": Form sudah terisi dengan data produk yang diambil dari database.@method('PUT'): Digunakan untuk mengirimkan request PUT untuk memperbarui data produk. Penulisan Koding CRUD pada Controller untuk Setiap Model Di Laravel, Controller digunakan untuk mengelola logika aplikasi yang berhubungan dengan CRUD (Create, Read, Update, Delete). Pada proyek jual beli mobil ini, kita akan membuat sebuah Controller untuk mengelola produk. Di sini, kita akan membahas kode CRUD untuk ProductController, namun pendekatannya bisa diterapkan juga pada model-model lain seperti Category, Customer, dan Transaction. 1. Membuat Controller Pertama, buatlah controller untuk Product menggunakan perintah Artisan: php artisan make:controller ProductController Perintah ini akan membuat file ProductController di direktori app/Http/Controllers/. Kita akan menambahkan semua logika CRUD di dalam controller ini. 2. Kode CRUD di ProductController Di bawah ini adalah kode lengkap untuk menangani operasi CRUD pada Product di ProductController: namespace App\\\\Http\\\\Controllers; use App\\\\Models\\\\Product; use App\\\\Models\\\\Category; use Illuminate\\\\Http\\\\Request; class ProductController extends Controller { // Menampilkan daftar produk (Read) public function index() { // Mengambil semua produk dari database dan mem-paginate 10 data per halaman $products = Product::with('category')->paginate(10); // Return view dengan data produk return view('products.index', compact('products')); } // Menampilkan form untuk membuat produk baru (Create) public function create() { // Mengambil semua kategori untuk ditampilkan pada form select $categories = Category::all(); // Return view untuk menampilkan form return view('products.create', compact('categories')); } // Menyimpan data produk baru ke database (Store) public function store(Request $request) { // Validasi data yang dikirimkan dari form $request->validate([ 'name' => 'required|string|max:255', 'description' => 'required|string', 'price' => 'required|numeric|min:0', 'category_id' => 'required|exists:categories,id', ]); // Menyimpan produk baru ke database Product::create($request->all()); // Redirect ke halaman daftar produk dengan pesan sukses return redirect()->route('products.index')->with('success', 'Produk berhasil ditambahkan.'); } // Menampilkan form untuk mengedit produk yang ada (Edit) public function edit($id) { // Cari produk berdasarkan ID $product = Product::findOrFail($id); // Ambil semua kategori untuk form select $categories = Category::all(); // Return view dengan data produk yang akan di-edit return view('products.edit', compact('product', 'categories')); } // Memperbarui data produk di database (Update) public function update(Request $request, $id) { // Validasi data dari form $request->validate([ 'name' => 'required|string|max:255', 'description' => 'required|string', 'price' => 'required|numeric|min:0', 'category_id' => 'required|exists:categories,id', ]); // Cari produk berdasarkan ID $product = Product::findOrFail($id); // Update produk di database $product->update($request->all()); // Redirect ke halaman daftar produk dengan pesan sukses return redirect()->route('products.index')->with('success', 'Produk berhasil diupdate.'); } // Menghapus produk dari database (Delete) public function destroy($id) { // Cari produk berdasarkan ID $product = Product::findOrFail($id); // Hapus produk dari database $product->delete(); // Redirect ke halaman daftar produk dengan pesan sukses return redirect()->route('products.index')->with('success', 'Produk berhasil dihapus.'); } } Penjelasan Kode ProductController: index(): Method ini digunakan untuk menampilkan daftar produk. Data produk dipaginate menggunakan paginate(10) sehingga hanya 10 produk yang ditampilkan per halaman.create(): Method ini menampilkan form untuk menambahkan produk baru. Kita juga mengambil semua kategori untuk ditampilkan pada form select kategori.store(Request $request): Method ini digunakan untuk menyimpan produk baru ke dalam database. Sebelum menyimpan, kita melakukan validasi terhadap data yang dikirim dari form untuk memastikan semua field diisi dengan benar.edit($id): Method ini digunakan untuk menampilkan form edit produk yang ada. Produk diambil berdasarkan ID, dan kita juga mengambil semua kategori untuk ditampilkan pada form select.update(Request $request, $id): Method ini digunakan untuk memperbarui data produk di database. Sama seperti store(), method ini juga memvalidasi data sebelum menyimpan perubahan.destroy($id): Method ini digunakan untuk menghapus produk dari database. Setelah produk dihapus, pengguna akan diarahkan kembali ke halaman daftar produk dengan pesan sukses. 3. Route untuk CRUD di web.php dengan Detail dan Lengkap Untuk mengaktifkan semua operasi CRUD di aplikasi Laravel, kita perlu mendefinisikan route di dalam file routes/web.php. Laravel menyediakan fitur resource route, yang memungkinkan kita untuk menangani semua operasi CRUD (Create, Read, Update, Delete) dengan satu baris kode saja. Ini akan secara otomatis menghasilkan rute untuk setiap operasi CRUD yang kita perlukan dalam aplikasi. Berikut adalah langkah-langkah dan detail untuk mengelola route CRUD di web.php: Langkah 1: Definisikan Resource Route untuk Produk Kita bisa menggunakan resource route untuk ProductController seperti berikut: use App\\\\Http\\\\Controllers\\\\ProductController; // Definisikan resource route untuk produk Route::resource('products', ProductController::class); Perintah Route::resource('products', ProductController::class) akan menghasilkan serangkaian route secara otomatis yang menangani operasi CRUD pada produk. Rute-rute ini mencakup operasi untuk menampilkan daftar produk, membuat produk baru, mengedit, memperbarui, dan menghapus produk. Rute yang Dihasilkan oleh Resource Route Dengan hanya mendefinisikan Route::resource('products', ProductController::class), Laravel akan menghasilkan rute berikut secara otomatis: HTTP MethodURLActionKegunaanGET/productsindexMenampilkan daftar produkGET/products/createcreateMenampilkan form untuk membuat produkPOST/productsstoreMenyimpan produk baru ke databaseGET/products/{product}showMenampilkan detail produk tertentuGET/products/{product}/editeditMenampilkan form untuk mengedit produkPUT/PATCH/products/{product}updateMemperbarui data produk di databaseDELETE/products/{product}destroyMenghapus produk dari database Penjelasan rute yang dihasilkan: GET /products: Rute ini digunakan untuk menampilkan daftar semua produk. Biasanya, halaman ini berisi tabel atau daftar produk.GET /products/create: Rute ini akan menampilkan formulir untuk membuat produk baru.POST /products: Rute ini digunakan untuk menyimpan produk baru ke dalam database. Data produk akan dikirimkan melalui formulir menggunakan metode POST.GET /products/{product}: Rute ini menampilkan detail produk tertentu berdasarkan ID produk. Meskipun sering tidak digunakan dalam aplikasi berbasis dashboard admin, rute ini bisa berguna dalam aplikasi front-end untuk melihat detail produk.GET /products/{product}/edit: Rute ini akan menampilkan formulir untuk mengedit produk yang sudah ada. Produk diambil berdasarkan ID yang diberikan pada URL.PUT/PATCH /products/{product}: Rute ini digunakan untuk memperbarui data produk yang sudah ada. Data yang diperbarui dikirim melalui formulir menggunakan metode PUT atau PATCH.DELETE /products/{product}: Rute ini digunakan untuk menghapus produk dari database berdasarkan ID produk. Langkah 2: Mengelola Route CRUD untuk Model Lain Untuk model lain seperti Customer dan Transaction, kita bisa mendefinisikan resource route dengan cara yang sama. Misalnya, untuk CustomerController dan TransactionController, kita tambahkan kode berikut di file web.php: use App\\\\Http\\\\Controllers\\\\CustomerController; use App\\\\Http\\\\Controllers\\\\TransactionController; // Definisikan resource route untuk pelanggan Route::resource('customers', CustomerController::class); // Definisikan resource route untuk transaksi Route::resource('transactions', TransactionController::class); Penjelasan: Route::resource('customers', CustomerController::class) akan menghasilkan rute CRUD untuk mengelola pelanggan, seperti menampilkan daftar pelanggan, membuat pelanggan baru, mengedit, memperbarui, dan menghapus pelanggan.Route::resource('transactions', TransactionController::class) akan menghasilkan rute CRUD untuk mengelola transaksi, seperti menampilkan daftar transaksi, menambahkan transaksi baru, mengedit, memperbarui, dan menghapus transaksi. Dengan ini, kita dapat menangani semua operasi CRUD untuk setiap model di aplikasi dengan menggunakan resource route, sehingga tidak perlu menuliskan setiap rute CRUD secara manual. Langkah 3: Customizing Resource Route Jika Anda hanya ingin menggunakan sebagian dari operasi CRUD, Anda bisa menyesuaikan resource route dengan menambahkan parameter only atau except. Sebagai contoh: Menggunakan only untuk hanya menyediakan rute tertentu: Route::resource('products', ProductController::class)->only(['index', 'create', 'store']); Rute di atas hanya akan menghasilkan rute untuk index, create, dan store, tanpa rute lain seperti edit, update, atau destroy.Menggunakan except untuk mengecualikan rute tertentu: Route::resource('products', ProductController::class)->except(['show']); Rute di atas akan menghasilkan semua rute CRUD kecuali show (menampilkan detail produk). Langkah 4: Route Names Setiap resource route juga memiliki nama yang secara otomatis dihasilkan oleh Laravel. Nama ini bisa digunakan untuk membuat link atau redirect. Berikut adalah nama yang dihasilkan oleh resource route: HTTP MethodURLActionRoute NameGET/productsindexproducts.indexGET/products/createcreateproducts.createPOST/productsstoreproducts.storeGET/products/{product}showproducts.showGET/products/{product}/editeditproducts.editPUT/PATCH/products/{product}updateproducts.updateDELETE/products/{product}destroyproducts.destroy Sebagai contoh, untuk membuat link ke halaman daftar produk, Anda bisa menggunakan nama route products.index seperti ini: <a href="{{ route('products.index') }}">Daftar Produk</a> 4. Kode CRUD untuk Model Lain (Category, Customer, Transaction) Langkah-langkah dan koding CRUD untuk model lainnya seperti Category, Customer, dan Transaction pada dasarnya mengikuti pola yang sama dengan ProductController. Perbedaannya hanya pada field-field yang dimasukkan ke dalam validasi, dan penyesuaian relasi model yang diperlukan. Contoh untuk CategoryController: namespace App\\\\Http\\\\Controllers; use App\\\\Models\\\\Category; use Illuminate\\\\Http\\\\Request; class CategoryController extends Controller { public function index() { $categories = Category::paginate(10); return view('categories.index', compact('categories')); } public function create() { return view('categories.create'); } public function store(Request $request) { $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', ]); Category::create($request->all()); return redirect()->route('categories.index')->with('success', 'Kategori berhasil ditambahkan.'); } public function edit($id) { $category = Category::findOrFail($id); return view('categories.edit', compact('category')); } public function update(Request $request, $id) { $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', ]); $category = Category::findOrFail($id); $category->update($request->all()); return redirect()->route('categories.index')->with('success', 'Kategori berhasil diupdate.'); } public function destroy($id) { $category = Category::findOrFail($id); $category->delete(); return redirect()->route('categories.index')->with('success', 'Kategori berhasil dihapus.'); } } Kode CRUD untuk CustomerController dan TransactionController dengan Detail dan Lengkap Setelah memahami struktur CRUD pada ProductController, berikut adalah implementasi CRUD untuk CustomerController dan TransactionController. Kedua controller ini mengikuti pola yang sama dengan ProductController, namun dengan penyesuaian pada field dan relasi yang relevan dengan model Customer dan Transaction. 1. CustomerController CustomerController digunakan untuk mengelola data pelanggan, seperti menambah pelanggan baru, mengedit data pelanggan, menampilkan daftar pelanggan, dan menghapus pelanggan. Berikut adalah kode lengkap CustomerController: namespace App\\\\Http\\\\Controllers; use App\\\\Models\\\\Customer; use Illuminate\\\\Http\\\\Request; class CustomerController extends Controller { // Menampilkan daftar pelanggan (Read) public function index() { // Mengambil semua data pelanggan dan mem-paginate 10 data per halaman $customers = Customer::paginate(10); // Return view dengan data pelanggan return view('customers.index', compact('customers')); } // Menampilkan form untuk membuat pelanggan baru (Create) public function create() { // Return view untuk menampilkan form pendaftaran pelanggan baru return view('customers.create'); } // Menyimpan data pelanggan baru ke database (Store) public function store(Request $request) { // Validasi input dari form $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:customers,email', 'phone' => 'required|string|max:15', 'address' => 'required|string', ]); // Menyimpan data pelanggan baru ke database Customer::create($request->all()); // Redirect ke halaman daftar pelanggan dengan pesan sukses return redirect()->route('customers.index')->with('success', 'Pelanggan berhasil ditambahkan.'); } // Menampilkan form untuk mengedit pelanggan (Edit) public function edit($id) { // Cari pelanggan berdasarkan ID $customer = Customer::findOrFail($id); // Return view untuk mengedit data pelanggan return view('customers.edit', compact('customer')); } // Memperbarui data pelanggan di database (Update) public function update(Request $request, $id) { // Validasi input dari form $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:customers,email,' . $id, 'phone' => 'required|string|max:15', 'address' => 'required|string', ]); // Cari pelanggan berdasarkan ID $customer = Customer::findOrFail($id); // Update data pelanggan di database $customer->update($request->all()); // Redirect ke halaman daftar pelanggan dengan pesan sukses return redirect()->route('customers.index')->with('success', 'Data pelanggan berhasil diupdate.'); } // Menghapus pelanggan dari database (Delete) public function destroy($id) { // Cari pelanggan berdasarkan ID $customer = Customer::findOrFail($id); // Hapus pelanggan dari database $customer->delete(); // Redirect ke halaman daftar pelanggan dengan pesan sukses return redirect()->route('customers.index')->with('success', 'Pelanggan berhasil dihapus.'); } } Penjelasan Kode CustomerController: index(): Menampilkan daftar pelanggan dengan pagination.create(): Menampilkan form untuk membuat pelanggan baru.store(): Validasi data dari form dan menyimpan pelanggan baru ke database.edit(): Menampilkan form untuk mengedit data pelanggan yang sudah ada berdasarkan ID.update(): Memperbarui data pelanggan di database setelah melakukan validasi.destroy(): Menghapus pelanggan dari database berdasarkan ID. 2. TransactionController TransactionController digunakan untuk mengelola data transaksi, seperti menambah transaksi baru, mengedit transaksi, menampilkan daftar transaksi, dan menghapus transaksi. Setiap transaksi biasanya berhubungan dengan customer dan product, sehingga kita juga perlu mengelola relasi ini. Berikut adalah kode lengkap TransactionController: namespace App\\\\Http\\\\Controllers; use App\\\\Models\\\\Transaction; use App\\\\Models\\\\Customer; use App\\\\Models\\\\Product; use Illuminate\\\\Http\\\\Request; class TransactionController extends Controller { // Menampilkan daftar transaksi (Read) public function index() { // Mengambil semua data transaksi beserta relasi ke customer dan produk $transactions = Transaction::with(['customer', 'product'])->paginate(10); // Return view dengan data transaksi return view('transactions.index', compact('transactions')); } // Menampilkan form untuk membuat transaksi baru (Create) public function create() { // Mengambil semua customer dan product untuk form select $customers = Customer::all(); $products = Product::all(); // Return view untuk menampilkan form return view('transactions.create', compact('customers', 'products')); } // Menyimpan data transaksi baru ke database (Store) public function store(Request $request) { // Validasi input dari form $request->validate([ 'customer_id' => 'required|exists:customers,id', 'product_id' => 'required|exists:products,id', 'total_price' => 'required|numeric|min:0', 'transaction_date' => 'required|date', ]); // Menyimpan transaksi baru ke database Transaction::create($request->all()); // Redirect ke halaman daftar transaksi dengan pesan sukses return redirect()->route('transactions.index')->with('success', 'Transaksi berhasil ditambahkan.'); } // Menampilkan form untuk mengedit transaksi yang ada (Edit) public function edit($id) { // Cari transaksi berdasarkan ID $transaction = Transaction::findOrFail($id); // Ambil semua customer dan product untuk form select $customers = Customer::all(); $products = Product::all(); // Return view untuk mengedit transaksi return view('transactions.edit', compact('transaction', 'customers', 'products')); } // Memperbarui data transaksi di database (Update) public function update(Request $request, $id) { // Validasi input dari form $request->validate([ 'customer_id' => 'required|exists:customers,id', 'product_id' => 'required|exists:products,id', 'total_price' => 'required|numeric|min:0', 'transaction_date' => 'required|date', ]); // Cari transaksi berdasarkan ID $transaction = Transaction::findOrFail($id); // Update data transaksi di database $transaction->update($request->all()); // Redirect ke halaman daftar transaksi dengan pesan sukses return redirect()->route('transactions.index')->with('success', 'Transaksi berhasil diupdate.'); } // Menghapus transaksi dari database (Delete) public function destroy($id) { // Cari transaksi berdasarkan ID $transaction = Transaction::findOrFail($id); // Hapus transaksi dari database $transaction->delete(); // Redirect ke halaman daftar transaksi dengan pesan sukses return redirect()->route('transactions.index')->with('success', 'Transaksi berhasil dihapus.'); } } Penjelasan Kode TransactionController: index(): Mengambil data transaksi bersama dengan relasinya ke customer dan product menggunakan metode with() dan menampilkan daftar transaksi dengan pagination.create(): Menampilkan form untuk membuat transaksi baru, mengambil data customer dan product untuk ditampilkan dalam form select.store(): Menyimpan transaksi baru ke database setelah memvalidasi input dari form.edit(): Menampilkan form untuk mengedit transaksi yang sudah ada berdasarkan ID transaksi.update(): Memperbarui data transaksi di database setelah validasi.destroy(): Menghapus transaksi berdasarkan ID dan mengarahkan kembali ke halaman daftar transaksi dengan pesan sukses. 8. Uji Coba Fitur CRUD Secara Detail dan Lengkap Setelah menyelesaikan semua langkah dalam membangun fitur CRUD (Create, Read, Update, Delete) untuk aplikasi jual beli mobil, langkah terakhir adalah melakukan uji coba untuk memastikan bahwa semua fungsi bekerja dengan baik. Dalam tahap ini, kita akan menguji setiap operasi CRUD di aplikasi Laravel yang telah kita bangun, mulai dari menambahkan data, menampilkan data, mengedit data, hingga menghapus data. Berikut adalah langkah-langkah detail untuk melakukan uji coba fitur CRUD: Langkah 1: Menjalankan Server Lokal Untuk menguji aplikasi Laravel yang kita buat, kita perlu menjalankan server lokal. Laravel menyediakan command bawaan untuk menjalankan server menggunakan Artisan. Buka terminal di direktori proyek Laravel Anda dan jalankan perintah berikut: php artisan serve Perintah ini akan menjalankan server di alamat http://127.0.0.1:8000 (atau bisa jadi alamat lain tergantung konfigurasi). Jika Anda ingin menjalankan server di port tertentu, Anda bisa menambahkan port yang diinginkan: php artisan serve --port=8080 Setelah server berjalan, buka browser Anda dan akses aplikasi melalui URL http://127.0.0.1:8000. Langkah 2: Uji Coba Create (Menambahkan Produk Baru) Akses halaman Tambah Produk dengan membuka URL http://127.0.0.1:8000/products/create atau klik tombol Tambah Produk Baru pada halaman daftar produk.Isi formulir untuk menambahkan produk baru. Pastikan semua field seperti Nama Produk, Deskripsi, Harga, dan Kategori diisi dengan benar.Klik tombol Simpan.Jika produk berhasil ditambahkan, Anda akan diarahkan kembali ke halaman daftar produk, dan produk baru yang Anda tambahkan akan terlihat di tabel. Catatan: Jika ada validasi yang gagal (seperti kolom yang wajib diisi tidak terisi), pesan error akan muncul di atas formulir. Langkah 3: Uji Coba Read (Menampilkan Daftar Produk) Buka halaman utama produk di URL http://127.0.0.1:8000/products untuk melihat daftar produk yang sudah ada.Pastikan produk yang telah Anda tambahkan muncul di tabel dengan informasi lengkap seperti Nama Produk, Deskripsi, Harga, dan Kategori.Periksa juga apakah tombol Edit dan Hapus tersedia di setiap baris produk untuk mengelola data lebih lanjut. Catatan: Jika jumlah produk melebihi batas per halaman, pastikan pagination bekerja dengan baik dan menampilkan produk secara bertahap. Langkah 4: Uji Coba Update (Mengedit Produk) Pada halaman daftar produk, klik tombol Edit di salah satu produk yang ingin Anda ubah.Anda akan diarahkan ke halaman Edit Produk (http://127.0.0.1:8000/products/{id}/edit), di mana formulir yang terisi dengan data produk saat ini akan ditampilkan.Ubah informasi produk sesuai kebutuhan, misalnya, ganti Harga atau Deskripsi.Klik tombol Update untuk menyimpan perubahan.Setelah perubahan disimpan, Anda akan diarahkan kembali ke halaman daftar produk, dan produk yang di-edit akan menampilkan data yang sudah di-update. Catatan: Jika ada kesalahan dalam input, seperti kolom yang wajib diisi kosong, pesan error akan muncul, dan Anda dapat memperbaiki kesalahan tersebut. Langkah 5: Uji Coba Delete (Menghapus Produk) Pada halaman daftar produk, klik tombol Hapus pada produk yang ingin Anda hapus.Sebuah pesan konfirmasi akan muncul meminta Anda untuk memastikan apakah Anda benar-benar ingin menghapus produk tersebut. Jika Anda yakin, klik OK.Setelah mengklik OK, produk akan dihapus dari database, dan Anda akan diarahkan kembali ke halaman daftar produk dengan pesan sukses yang memberitahukan bahwa produk berhasil dihapus. Catatan: Produk yang dihapus tidak akan muncul lagi di daftar, dan data terkait produk tersebut akan dihapus secara permanen dari database. Langkah 6: Pengujian Keseluruhan Untuk memastikan semua fitur bekerja dengan baik, lakukan pengujian keseluruhan dengan skenario berikut: Tambahkan beberapa produk untuk menguji apakah fitur Create berfungsi.Tampilkan daftar produk untuk memastikan Read bekerja.Ubah informasi beberapa produk untuk memastikan Update berfungsi dengan baik.Hapus beberapa produk untuk memastikan fitur Delete berjalan lancar.Pastikan tidak ada bug atau masalah validasi yang muncul selama pengujian. Langkah 7: Penanganan Error dan Validasi Pastikan aplikasi sudah menangani semua validasi dan error dengan baik. Coba skenario berikut untuk memastikan error handling berfungsi: Coba tambahkan produk tanpa mengisi semua field yang diperlukan, dan pastikan pesan error muncul.Coba edit produk dengan mengisi field dengan nilai yang tidak valid, dan pastikan validasi berfungsi.Pastikan jika mencoba menghapus produk yang tidak ada, aplikasi menampilkan pesan error yang sesuai. Kesimpulan Dengan melakukan uji coba ini, kita dapat memastikan bahwa fitur CRUD pada aplikasi jual beli mobil berfungsi dengan baik. Semua operasi Create, Read, Update, dan Delete dapat dijalankan dengan lancar, dan pengguna dapat mengelola data produk dengan mudah melalui antarmuka yang kita buat. Pengujian ini penting untuk memastikan aplikasi bekerja secara optimal sebelum di-deploy ke production. Penutup: Terus Belajar dan Mengasah Kemampuan sebagai Programmer Sebagai programmer, kita memiliki tanggung jawab untuk terus belajar dan mengasah kemampuan, terutama dalam menguasai framework yang populer seperti Laravel. Setiap proyek yang kita bangun, seperti aplikasi jual beli mobil dengan fitur CRUD ini, adalah kesempatan untuk meningkatkan skill dan memperdalam pemahaman kita tentang berbagai konsep pemrograman, mulai dari manajemen database, validasi input, hingga penerapan arsitektur yang baik. Tidak hanya itu, membangun banyak proyek untuk portfolio juga sangat penting untuk menunjukkan kemampuan kita kepada calon klien atau perusahaan. Portfolio yang solid akan meningkatkan peluang kita dalam mendapatkan proyek atau pekerjaan yang lebih baik. Jika Anda ingin belajar lebih dalam lagi, terutama dengan bimbingan dari mentor yang sudah expert di bidangnya, Anda dapat belajar di Buildwithangga. Di sana, Anda akan mendapatkan akses kelas seumur hidup, yang memungkinkan Anda untuk belajar kapan saja dan mengulang materi sesuai kebutuhan. Selain itu, Anda juga bisa mendapatkan berbagai manfaat seperti konsultasi langsung dengan mentor, bergabung dengan grup diskusi bersama siswa lain, dan mempersiapkan diri dengan lebih baik untuk dunia kerja. Jadi, jangan ragu untuk terus belajar, eksplorasi proyek baru, dan jadikan setiap kesempatan sebagai langkah untuk menjadi programmer yang lebih baik. Selamat belajar dan semoga sukses!

Kelas Tutorial Laravel 11 dan Filament Bikin Multi Tenant Projek Apotek Online di BuildWithAngga

Tutorial Laravel 11 dan Filament Bikin Multi Tenant Projek Apotek Online

Pada tutorial ini, kita akan belajar bagaimana membuat website apotek online dengan sistem multi-tenant menggunakan Laravel 11 dan Filament. Dalam sistem ini, terdapat beberapa user dengan hak akses berbeda, seperti super admin dan doctor, di mana masing-masing memiliki fitur yang sesuai dengan perannya. Menggunakan Laravel sebagai framework back-end dan Filament sebagai admin panel, kita dapat membangun website apotek online yang scalable, aman, dan mudah dikelola. Laravel menawarkan fitur-fitur yang memudahkan pengembangan, sedangkan Filament mempermudah pembuatan dashboard admin yang intuitif dan user-friendly. Berikut ini adalah langkah-langkah lengkap dalam membangun projek apotek online multi-tenant ini. 1. Membuat File Model dan Migration Menggunakan Artisan Command Sebelum memulai pengkodean, kita perlu menyiapkan struktur database yang akan digunakan untuk menyimpan data di aplikasi apotek. Tabel-tabel yang kita perlukan meliputi: Categories: Menyimpan kategori obat (misalnya: antibiotik, vitamin, dll.)Medicines: Menyimpan informasi obat yang tersediaPatients: Menyimpan data pasien yang telah mendaftarTransactions: Menyimpan catatan transaksi pembelian obatDoctors: Menyimpan informasi dokter yang terdaftar di sistem Untuk membuat model dan migration, kita menggunakan Artisan command dari Laravel. Jalankan perintah berikut di terminal: php artisan make:model Category -m php artisan make:model Medicine -m php artisan make:model Patient -m php artisan make:model Transaction -m php artisan make:model Doctor -m Perintah di atas membuat model beserta file migration untuk masing-masing entitas. Berikut adalah beberapa contoh migration yang harus disesuaikan untuk setiap tabel. Migration untuk Tabel Categories use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateCategoriesTable extends Migration { public function up() { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('categories'); } } Migration untuk Tabel Medicines use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateMedicinesTable extends Migration { public function up() { Schema::create('medicines', function (Blueprint $table) { $table->id(); $table->string('name'); $table->text('description'); $table->integer('quantity'); $table->decimal('price', 8, 2); $table->foreignId('category_id')->constrained()->onDelete('cascade'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('medicines'); } } Migration untuk Tabel Patients use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreatePatientsTable extends Migration { public function up() { Schema::create('patients', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->string('phone_number'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('patients'); } } Migration untuk Tabel Transactions use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateTransactionsTable extends Migration { public function up() { Schema::create('transactions', function (Blueprint $table) { $table->id(); $table->foreignId('patient_id')->constrained()->onDelete('cascade'); $table->foreignId('medicine_id')->constrained()->onDelete('cascade'); $table->integer('quantity'); $table->decimal('total_price', 8, 2); $table->timestamps(); }); } public function down() { Schema::dropIfExists('transactions'); } } Migration untuk Tabel Doctors use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateDoctorsTable extends Migration { public function up() { Schema::create('doctors', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->string('phone_number'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('doctors'); } } Setelah seluruh migration selesai dibuat, jalankan perintah berikut untuk meng-migrate struktur database ke dalam aplikasi: php artisan migrate 2. Mengisi Mass Assignment dan Mengatur Relationship pada Model Langkah selanjutnya adalah menambahkan mass assignment dan relationship antar model yang telah kita buat. Dalam Laravel, kita perlu mendefinisikan field apa saja yang bisa diisi secara otomatis melalui mass assignment. Selain itu, kita juga harus mengatur relasi antara tabel yang berhubungan, seperti relasi antara Category dan Medicine, Patient dan Transaction, serta Doctor dan Medicine. Model Category namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Category extends Model { use HasFactory; protected $fillable = ['name']; public function medicines() { return $this->hasMany(Medicine::class); } } Model Medicine namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Medicine extends Model { use HasFactory; protected $fillable = ['name', 'description', 'quantity', 'price', 'category_id']; public function category() { return $this->belongsTo(Category::class); } public function transactions() { return $this->hasMany(Transaction::class); } } Model Patient namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Patient extends Model { use HasFactory; protected $fillable = ['name', 'email', 'phone_number']; public function transactions() { return $this->hasMany(Transaction::class); } } Model Transaction namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Transaction extends Model { use HasFactory; protected $fillable = ['patient_id', 'medicine_id', 'quantity', 'total_price']; public function patient() { return $this->belongsTo(Patient::class); } public function medicine() { return $this->belongsTo(Medicine::class); } } Model Doctor namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Doctor extends Model { use HasFactory; protected $fillable = ['name', 'email', 'phone_number']; public function medicines() { return $this->hasMany(Medicine::class); } } 3. Menginstall Filament dan Membuat Akun Super Admin serta Doctor Langkah ini akan membahas cara menginstal Filament dan mengelola hak akses untuk dua jenis pengguna, yaitu super admin dan doctor, dengan fitur yang berbeda. Langkah 1: Menginstal Filament Pertama, pastikan Anda telah menyelesaikan setup model dan relasi database pada proyek Laravel. Filament akan digunakan untuk membangun admin panel yang intuitif dan efisien untuk mengelola data aplikasi seperti medicines, patients, dan transactions. Untuk menginstal Filament, jalankan perintah berikut di terminal: composer require filament/filament Setelah instalasi selesai, Anda perlu melakukan beberapa konfigurasi dasar pada Filament. Langkah 2: Mengonfigurasi Filament Setelah Filament berhasil diinstal, Anda dapat membuat admin panel yang bisa diakses melalui URL khusus, misalnya /admin. Untuk melakukan ini, jalankan perintah berikut: php artisan make:filament-user Perintah ini akan membuat user admin baru yang bisa digunakan untuk login ke dashboard Filament. Anda akan diminta mengisi beberapa informasi seperti email, password, dan nama pengguna. Setelah proses ini selesai, user baru tersebut bisa login ke admin panel. Selain itu, Filament juga memberikan kemudahan untuk membuat custom dashboard, resource management, dan role-based access control (RBAC). Langkah 3: Menambah Role dan Permission untuk Super Admin dan Doctor Kita akan menggunakan Spatie Permission package untuk menambahkan role dan permission pada sistem. Untuk menginstalnya, jalankan perintah berikut: composer require spatie/laravel-permission Setelah instalasi, publish konfigurasi package ini dengan perintah: php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider" Dan jangan lupa untuk menjalankan migrasi: php artisan migrate Sekarang, kita siap untuk menambahkan role super admin dan doctor. Pertama, tambahkan HasRoles trait ke dalam model User: use Spatie\\\\Permission\\\\Traits\\\\HasRoles; class User extends Authenticatable { use HasRoles; } Langkah 4: Membuat Seeder untuk Menambahkan Super Admin dan Doctor Untuk membuat akun super admin dan doctor, kita akan membuat sebuah seeder. Jalankan perintah berikut untuk membuat file seeder: php artisan make:seeder RoleSeeder Di dalam file RoleSeeder.php, tambahkan kode berikut: namespace Database\\\\Seeders; use Illuminate\\\\Database\\\\Seeder; use Spatie\\\\Permission\\\\Models\\\\Role; use App\\\\Models\\\\User; class RoleSeeder extends Seeder { public function run() { // Membuat role super admin dan doctor $superAdmin = Role::create(['name' => 'super_admin']); $doctor = Role::create(['name' => 'doctor']); // Membuat user super admin $userAdmin = User::create([ 'name' => 'Super Admin', 'email' => '[email protected]', 'password' => bcrypt('password'), ]); $userAdmin->assignRole($superAdmin); // Membuat user doctor $userDoctor = User::create([ 'name' => 'Doctor', 'email' => '[email protected]', 'password' => bcrypt('password'), ]); $userDoctor->assignRole($doctor); } } Seeder ini akan membuat dua user, satu untuk super admin dan satu untuk doctor, serta akan langsung memberikan role yang sesuai kepada masing-masing user. Jangan lupa untuk menjalankan seeder: php artisan db:seed --class=RoleSeeder Setelah seeder dijalankan, kita akan memiliki dua akun dengan role berbeda yang siap digunakan. Langkah 5: Membuat Fitur Khusus untuk Setiap Role Sekarang, kita akan mengatur perbedaan fitur yang bisa diakses oleh masing-masing role. Dalam hal ini, super admin memiliki akses untuk mengelola semua data seperti medicines dan transactions, sedangkan doctor hanya bisa melihat data medicines dan patients. Untuk mengatur hak akses ini, tambahkan middleware role ke dalam route di file web.php. Berikut contohnya: use App\\\\Http\\\\Controllers\\\\MedicineController; use App\\\\Http\\\\Controllers\\\\TransactionController; use App\\\\Http\\\\Controllers\\\\PatientController; Route::middleware(['role:super_admin'])->group(function () { Route::resource('medicines', MedicineController::class); Route::resource('transactions', TransactionController::class); }); Route::middleware(['role:doctor'])->group(function () { Route::get('medicines', [MedicineController::class, 'index'])->name('medicines.index'); Route::get('patients', [PatientController::class, 'index'])->name('patients.index'); }); Dengan konfigurasi di atas, hanya user dengan role super admin yang bisa mengakses dan mengelola data obat dan transaksi, sementara doctor hanya dapat melihat daftar obat dan pasien. 4. Membuat Navigation Blade untuk Role Super Admin dan Doctor Selanjutnya, kita perlu membuat navigasi yang menyesuaikan dengan role masing-masing pengguna. Dengan begitu, pengguna hanya melihat menu yang sesuai dengan hak akses mereka. Di dalam file Blade, kita bisa menambahkan logika untuk memeriksa role user saat ini dan menampilkan menu yang relevan: <ul> @if(auth()->user()->hasRole('super_admin')) <li><a href="{{ route('medicines.index') }}">Kelola Obat</a></li> <li><a href="{{ route('transactions.index') }}">Kelola Transaksi</a></li> @endif @if(auth()->user()->hasRole('doctor')) <li><a href="{{ route('medicines.index') }}">Lihat Obat</a></li> <li><a href="{{ route('patients.index') }}">Lihat Pasien</a></li> @endif </ul> Dengan kode di atas, ketika user super admin login, mereka akan melihat menu untuk mengelola data obat dan transaksi. Sedangkan doctor hanya akan melihat menu untuk melihat data obat dan pasien. Menambahkan Fitur Role dan Permission Management pada Dashboard Filament Setelah kita selesai mengatur role dan permission di aplikasi Laravel, langkah selanjutnya adalah memungkinkan pengguna untuk mengelola roles dan permissions langsung dari dashboard Filament. Ini sangat memudahkan administrator untuk membuat, mengedit, dan menghapus role serta mengatur permissions tanpa harus mengakses kode secara manual. Langkah 1: Membuat Resource untuk Role dan Permission di Filament Filament menyediakan cara yang mudah untuk membuat halaman resource yang terhubung dengan model seperti Role dan Permission. Kita akan membuat resource untuk Role dan Permission menggunakan command artisan. Pertama, buat resource untuk Role: php artisan make:filament-resource Role Command di atas akan menghasilkan sebuah resource yang bisa kita gunakan di dashboard Filament. Selanjutnya, buka file resource yang dihasilkan di app/Filament/Resources/RoleResource.php dan sesuaikan dengan menambahkan field yang diperlukan: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\RoleResource\\\\Pages; use Filament\\\\Forms; use Filament\\\\Tables; use Spatie\\\\Permission\\\\Models\\\\Role; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Table; class RoleResource extends Resource { protected static ?string $model = Role::class; protected static ?string $navigationIcon = 'heroicon-o-shield-check'; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->unique(Role::class, 'name'), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('name') ->sortable() ->searchable(), Tables\\\\Columns\\\\TextColumn::make('created_at') ->dateTime('d M Y') ->sortable(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListRoles::route('/'), 'create' => Pages\\\\CreateRole::route('/create'), 'edit' => Pages\\\\EditRole::route('/{record}/edit'), ]; } } Langkah di atas akan menambahkan kemampuan untuk membuat, mengedit, dan menghapus roles di dalam dashboard Filament. Sekarang, kita akan melakukan hal yang sama untuk Permission. Jalankan command berikut untuk membuat resource permission: php artisan make:filament-resource Permission Kemudian buka file app/Filament/Resources/PermissionResource.php dan sesuaikan dengan menambahkan field seperti yang kita lakukan pada resource Role: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\PermissionResource\\\\Pages; use Filament\\\\Forms; use Filament\\\\Tables; use Spatie\\\\Permission\\\\Models\\\\Permission; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Table; class PermissionResource extends Resource { protected static ?string $model = Permission::class; protected static ?string $navigationIcon = 'heroicon-o-key'; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->unique(Permission::class, 'name'), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('name') ->sortable() ->searchable(), Tables\\\\Columns\\\\TextColumn::make('created_at') ->dateTime('d M Y') ->sortable(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListPermissions::route('/'), 'create' => Pages\\\\CreatePermission::route('/create'), 'edit' => Pages\\\\EditPermission::route('/{record}/edit'), ]; } } Dengan menambahkan resource ini, kita sekarang memiliki halaman untuk membuat, mengedit, dan menghapus permissions di dashboard Filament. Langkah 2: Menambahkan Menu Navigasi untuk Role dan Permission Setelah kita membuat resource untuk Role dan Permission, kita juga harus memastikan bahwa mereka muncul di menu navigasi dashboard Filament. Secara default, Filament akan menampilkan resource di sidebar navigasi, tetapi kita bisa mengatur urutannya atau menambahkan ikon khusus agar lebih mudah dikenali. Jika ingin mengatur navigasi dan menambahkan ikon yang sesuai, buka masing-masing file resource (RoleResource.php dan PermissionResource.php) dan pastikan navigationIcon sudah terisi, seperti contoh berikut: protected static ?string $navigationIcon = 'heroicon-o-shield-check'; // Untuk Role protected static ?string $navigationIcon = 'heroicon-o-key'; // Untuk Permission Sekarang, ketika Anda login ke dashboard Filament, Anda akan melihat menu Role dan Permission di sidebar. Super admin dapat menambah, mengedit, dan menghapus role serta permission sesuai kebutuhan sistem. Langkah 3: Mengelola Role dan Permission di Dashboard Filament Setelah semuanya selesai, Anda dapat mengakses dashboard Filament dan mengelola role serta permission melalui interface yang disediakan. Akses halaman ini melalui URL seperti http://your-app-domain/admin, kemudian login menggunakan akun super admin yang telah dibuat sebelumnya. Di dalam dashboard, Anda dapat: Membuat role baru dengan memberikan nama role dan menambahkannya ke user.Menambah permission baru, misalnya akses khusus untuk mengelola data transaksi atau akses khusus untuk melihat laporan.Assign role dan permission ke user yang berbeda. Sebagai contoh, untuk menambahkan permission baru pada sebuah role, Anda bisa membuka halaman Role, pilih salah satu role (misalnya doctor), lalu tambahkan permission seperti view medicines dan view patients. Filament akan secara otomatis menangani relasi antara Role dan Permission di back-end. Kesimpulan Dengan menambahkan fitur Role dan Permission pada dashboard Filament, Anda memberikan fleksibilitas kepada admin untuk mengelola hak akses pengguna dengan lebih mudah tanpa harus memodifikasi kode secara manual. Hal ini sangat penting dalam proyek dengan sistem multi-tenant di mana user memiliki peran dan hak akses yang berbeda-beda. Langkah-langkah di atas meliputi cara menginstal Filament, menambah role dan permission menggunakan Spatie Permission, membuat resource untuk role dan permission di dashboard Filament, serta mengatur navigasi dan fitur untuk mengelola hak akses user. Dengan pendekatan ini, aplikasi apotek online Anda akan memiliki kontrol penuh atas manajemen user dan fitur yang dapat diakses oleh mereka. Penutup Laravel adalah framework yang sangat cocok dipelajari, terutama bagi pengembang web yang ingin membangun aplikasi yang scalable, aman, dan mudah dikelola. Dengan popularitas yang terus meningkat selama beberapa tahun terakhir, Laravel akan tetap menjadi pilihan utama dalam pengembangan aplikasi web, baik untuk proyek kecil maupun besar. Ditambah dengan ekosistem yang terus berkembang, Laravel menawarkan banyak kemudahan dan dukungan komunitas yang luas. Bagi Anda yang sedang mengerjakan proyek skripsi atau sedang mempersiapkan diri untuk menjadi developer web profesional, belajar Laravel bersama BuildWithAngga adalah pilihan yang tepat. Di sini, Anda akan belajar dari mentor expert dan berpengalaman yang akan membantu Anda menguasai Laravel dari dasar hingga tingkat lanjut. Anda juga mendapatkan akses seumur hidup ke semua materi pembelajaran, dengan benefit bertanya langsung kepada mentor jika mengalami kendala dalam belajar. Dengan begitu, Anda bisa lebih produktif dan yakin dalam menyelesaikan proyek-proyek Anda dengan hasil yang lebih menarik dan profesional. Jadi, tunggu apa lagi? Segera bergabung di BuildWithAngga dan mulailah belajar Laravel untuk membangun aplikasi yang mengesankan!

Kelas Tutorial Laravel 11 dan Filament: Membuat Dashboard Website Toko Baju di BuildWithAngga

Tutorial Laravel 11 dan Filament: Membuat Dashboard Website Toko Baju

Laravel 11 dan Filament adalah kombinasi yang luar biasa untuk membangun dashboard admin dan CMS untuk website toko baju yang sedang trending. Artikel ini akan memberikan panduan lengkap, mulai dari instalasi hingga mengupload proyek Laravel ke shared hosting. Tutorial ini akan membahas langkah-langkah praktis serta tips penting yang perlu dipahami oleh programmer, terutama pemula yang ingin memperdalam pengetahuan mereka dalam web development. Mengapa Laravel 11 dan Filament? Laravel 11 adalah versi terbaru dari framework PHP yang terkenal dengan kesederhanaan, keamanan, dan skalabilitasnya. Ditambah dengan Filament, sebuah package yang memungkinkan pembuatan panel admin yang powerful dan intuitif, kombinasi ini sangat cocok untuk membangun website modern seperti toko baju. Website toko baju yang memiliki berbagai produk, kategori, dan data pelanggan membutuhkan sistem yang kuat, mudah di-maintenance, serta kaya fitur untuk memudahkan pemilik toko mengelola bisnis mereka. Dengan Laravel 11 dan Filament, kita bisa membangun dashboard admin yang membantu pengelolaan data seperti produk, transaksi, dan pelanggan dengan lebih efisien. Langkah-langkah Membuat Dashboard Website Toko Baju Berikut adalah tahapan-tahapan lengkap dalam membuat dashboard website toko baju menggunakan Laravel 11 dan Filament: 1. Membuat Proyek Laravel 11 Terbaru Menggunakan Composer Langkah pertama, kita perlu menginstall Laravel 11 menggunakan Composer. Composer adalah dependency manager untuk PHP yang membantu mengelola library dan package yang diperlukan dalam proyek Laravel. composer create-project laravel/laravel toko-baju Setelah proses instalasi selesai, kita dapat masuk ke direktori proyek: cd toko-baju Kemudian jalankan server development Laravel: php artisan serve Proyek Laravel 11 Anda sekarang sudah berjalan di browser, biasanya di alamat http://localhost:8000. 2. Menginstall Package Filament PHP dan Membuat User Admin Baru Untuk menambahkan kemampuan CMS atau dashboard admin, kita akan menggunakan Filament. Pertama, instal Filament menggunakan Composer: composer require filament/filament Setelah instalasi selesai, kita perlu menjalankan beberapa perintah untuk membuat dashboard dan user admin: php artisan make:filament-user Ikuti instruksi yang muncul di terminal untuk membuat user admin baru yang akan memiliki akses penuh ke dashboard Filament. 3. Membuat File Migrations Langkah selanjutnya adalah membuat file migrations yang dibutuhkan untuk menyimpan data yang diperlukan dalam proyek toko baju. Kita akan membuat beberapa tabel berikut: Categories: Menyimpan informasi kategori produk.Fashion Designers: Menyimpan data desainer fashion yang bekerja sama dengan toko.Products: Menyimpan informasi produk seperti nama, harga, dan stok.Customers: Menyimpan data pelanggan.Transactions: Menyimpan data transaksi yang dilakukan oleh pelanggan. Jalankan perintah berikut untuk membuat migration file: php artisan make:migration create_categories_table php artisan make:migration create_fashion_designers_table php artisan make:migration create_products_table php artisan make:migration create_customers_table php artisan make:migration create_transactions_table Selanjutnya, buka masing-masing file migration di direktori database/migrations dan atur kolom yang dibutuhkan. Sebagai contoh, berikut adalah contoh migration untuk tabel Products: Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->decimal('price', 8, 2); $table->integer('stock'); $table->unsignedBigInteger('category_id'); $table->unsignedBigInteger('fashion_designer_id'); $table->timestamps(); // Definisi foreign key $table->foreign('category_id')->references('id')->on('categories'); $table->foreign('fashion_designer_id')->references('id')->on('fashion_designers'); }); Setelah semua migration siap, jalankan perintah berikut untuk membuat tabel di database: php artisan migrate 4. Membuat File Models dan Relationship ORM Setelah tabel siap, kita perlu membuat file models untuk setiap tabel. Models di Laravel akan mewakili setiap entitas di database. Untuk membuat model, jalankan perintah berikut: php artisan make:model Product php artisan make:model Category php artisan make:model FashionDesigner php artisan make:model Customer php artisan make:model Transaction Di dalam file model, atur mass assignment dan definisikan relationship antar tabel. Contohnya, untuk model Product, kita bisa menambahkan relationship dengan kategori dan desainer fashion: class Product extends Model { protected $fillable = ['name', 'price', 'stock', 'category_id', 'fashion_designer_id']; public function category() { return $this->belongsTo(Category::class); } public function fashionDesigner() { return $this->belongsTo(FashionDesigner::class); } } 5. Filament Resources untuk Proses CRUD Berikut adalah tata cara lengkap beserta contoh koding untuk Filament Resource pada setiap tabel yang telah dibuat di proyek website toko baju. Kita akan membuat resource Filament untuk setiap tabel, termasuk Categories, Fashion Designers, Products, Customers, dan Transactions. Dengan Filament, kita dapat memudahkan pengguna dalam melakukan proses CRUD (Create, Read, Update, Delete) melalui dashboard admin. 1. Membuat Filament Resource untuk Tabel Categories Pertama, kita akan membuat resource Filament untuk tabel Categories. Jalankan perintah berikut untuk membuat resource: php artisan make:filament-resource Category Perintah ini akan membuat file CategoryResource.php di dalam folder app/Filament/Resources. Mengatur Form pada Categories Resource Di dalam file CategoryResource.php, kita dapat mengatur schema form untuk input data kategori. Misalnya, kita akan meminta nama kategori dengan menggunakan field TextInput: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name') ->required() ->label('Category Name') ->maxLength(255), ]); } Mengatur Tabel pada Categories Resource Selanjutnya, kita juga dapat mengatur tampilan data kategori dalam bentuk tabel dengan menambahkan kolom: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name')->label('Category Name')->sortable()->searchable(), TextColumn::make('created_at')->label('Created At')->date(), ]); } Dengan konfigurasi ini, pengguna dapat melihat data kategori dalam bentuk tabel, dengan opsi untuk mengurutkan (sortable) dan mencari (searchable) berdasarkan nama kategori. 2. Membuat Filament Resource untuk Tabel Fashion Designers Untuk tabel Fashion Designers, langkah-langkahnya mirip dengan yang sebelumnya. Jalankan perintah berikut: php artisan make:filament-resource FashionDesigner Kemudian buka file FashionDesignerResource.php dan sesuaikan form dan tabelnya. Mengatur Form pada Fashion Designers Resource Di form ini, kita akan menambahkan input untuk nama desainer: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name') ->required() ->label('Designer Name') ->maxLength(255), TextInput::make('brand') ->label('Brand') ->maxLength(255), ]); } Mengatur Tabel pada Fashion Designers Resource Di tabel, kita akan menampilkan nama desainer dan brand mereka: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name')->label('Designer Name')->sortable()->searchable(), TextColumn::make('brand')->label('Brand')->sortable()->searchable(), TextColumn::make('created_at')->label('Created At')->date(), ]); } 3. Membuat Filament Resource untuk Tabel Products Untuk tabel Products, kita akan membuat resource yang lebih kompleks karena ada relationship dengan kategori dan desainer. Jalankan perintah berikut: php artisan make:filament-resource Product Mengatur Form pada Products Resource Di form produk, kita akan menambahkan input untuk nama produk, harga, stok, kategori, dan desainer. Kategori dan desainer akan menggunakan field Select yang terkait dengan tabel Categories dan Fashion Designers: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name') ->required() ->label('Product Name') ->maxLength(255), TextInput::make('price') ->required() ->label('Price') ->numeric(), TextInput::make('stock') ->required() ->label('Stock') ->numeric(), Select::make('category_id') ->relationship('category', 'name') ->required() ->label('Category'), Select::make('fashion_designer_id') ->relationship('fashionDesigner', 'name') ->required() ->label('Designer'), ]); } Mengatur Tabel pada Products Resource Di tabel, kita akan menampilkan nama produk, harga, stok, kategori, dan desainer: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name')->label('Product Name')->sortable()->searchable(), TextColumn::make('price')->label('Price')->money('usd')->sortable(), TextColumn::make('stock')->label('Stock')->sortable(), TextColumn::make('category.name')->label('Category'), TextColumn::make('fashion_designer.name')->label('Designer'), TextColumn::make('created_at')->label('Created At')->date(), ]) ->filters([ SelectFilter::make('category_id')->relationship('category', 'name'), ]); } 4. Membuat Filament Resource untuk Tabel Customers Untuk tabel Customers, jalankan perintah berikut: php artisan make:filament-resource Customer Mengatur Form pada Customers Resource Di form pelanggan, kita bisa menambahkan input untuk nama, email, dan nomor telepon: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name') ->required() ->label('Customer Name') ->maxLength(255), TextInput::make('email') ->required() ->label('Email') ->email(), TextInput::make('phone') ->required() ->label('Phone Number') ->tel(), ]); } Mengatur Tabel pada Customers Resource Tabel untuk pelanggan akan menampilkan nama, email, dan nomor telepon: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name')->label('Customer Name')->sortable()->searchable(), TextColumn::make('email')->label('Email')->sortable()->searchable(), TextColumn::make('phone')->label('Phone Number')->sortable(), TextColumn::make('created_at')->label('Created At')->date(), ]); } 5. Membuat Filament Resource untuk Tabel Transactions Terakhir, untuk tabel Transactions, jalankan perintah: php artisan make:filament-resource Transaction Mengatur Form pada Transactions Resource Form transaksi akan menampilkan input untuk memilih pelanggan, produk, dan jumlah produk yang dibeli: public static function form(Form $form): Form { return $form ->schema([ Select::make('customer_id') ->relationship('customer', 'name') ->required() ->label('Customer'), Select::make('product_id') ->relationship('product', 'name') ->required() ->label('Product'), TextInput::make('quantity') ->required() ->label('Quantity') ->numeric(), ]); } Mengatur Tabel pada Transactions Resource Tabel transaksi akan menampilkan nama pelanggan, nama produk, dan jumlah produk yang dibeli: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('customer.name')->label('Customer Name')->sortable()->searchable(), TextColumn::make('product.name')->label('Product Name')->sortable(), TextColumn::make('quantity')->label('Quantity')->sortable(), TextColumn::make('created_at')->label('Transaction Date')->date(), ]); } 6. Menampilkan Data di Table Berikut adalah tata cara lengkap menampilkan data menggunakan $table pada Filament Resource untuk setiap tabel yang telah dibuat, yaitu Categories, Fashion Designers, Products, Customers, dan Transactions. Dengan menggunakan $table, kita bisa menampilkan data dari database dalam bentuk tabel yang dapat diurutkan, difilter, dan dicari dengan mudah melalui dashboard admin. 1. Menampilkan Data pada CategoriesResource Untuk menampilkan data kategori, kita bisa menggunakan $table dengan beberapa kolom yang menampilkan informasi seperti nama kategori dan waktu pembuatan. Setiap kolom bisa disesuaikan agar bisa diurutkan (sortable) dan dicari (searchable). Contoh Penggunaan $table pada CategoriesResource public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name') ->label('Nama Kategori') ->sortable() // Kolom ini bisa diurutkan ->searchable(), // Kolom ini bisa dicari TextColumn::make('created_at') ->label('Dibuat Pada') ->date() // Menampilkan tanggal dengan format ->sortable(), ]); } Pada contoh di atas: Kolom name akan menampilkan nama kategori dan bisa diurutkan serta dicari.Kolom created_at akan menampilkan waktu pembuatan kategori dalam format tanggal. 2. Menampilkan Data pada FashionDesignerResource Untuk menampilkan data desainer fashion, kita akan menampilkan nama desainer, brand, dan waktu pembuatan. Setiap kolom juga bisa diurutkan dan dicari. Contoh Penggunaan $table pada FashionDesignerResource public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name') ->label('Nama Desainer') ->sortable() ->searchable(), TextColumn::make('brand') ->label('Brand') ->sortable() ->searchable(), TextColumn::make('created_at') ->label('Dibuat Pada') ->date() ->sortable(), ]); } Pada tabel di atas: name dan brand bisa diurutkan dan dicari untuk memudahkan navigasi di dashboard.created_at menampilkan waktu pembuatan data desainer dalam format tanggal. 3. Menampilkan Data pada ProductResource Tabel Products akan menampilkan nama produk, harga, stok, kategori, dan desainer. Kita juga bisa menambahkan filter untuk kategori agar memudahkan pengguna dalam mencari produk tertentu. Contoh Penggunaan $table pada ProductResource public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name') ->label('Nama Produk') ->sortable() ->searchable(), TextColumn::make('price') ->label('Harga') ->money('idr') // Menampilkan harga dengan format mata uang ->sortable(), TextColumn::make('stock') ->label('Stok') ->sortable(), TextColumn::make('category.name') ->label('Kategori'), TextColumn::make('fashion_designer.name') ->label('Desainer'), TextColumn::make('created_at') ->label('Dibuat Pada') ->date() ->sortable(), ]) ->filters([ SelectFilter::make('category_id') ->relationship('category', 'name') // Filter berdasarkan kategori ->label('Kategori'), ]); } Pada tabel produk: name, price, dan stock bisa diurutkan dan dicari.category.name dan fashion_designer.name menampilkan relasi dengan tabel Categories dan Fashion Designers.created_at menampilkan tanggal pembuatan data produk.Filter pada category_id memungkinkan pengguna untuk memfilter produk berdasarkan kategori. 4. Menampilkan Data pada CustomerResource Untuk tabel Customers, kita akan menampilkan nama pelanggan, email, nomor telepon, dan waktu pendaftaran pelanggan. Contoh Penggunaan $table pada CustomerResource public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name') ->label('Nama Pelanggan') ->sortable() ->searchable(), TextColumn::make('email') ->label('Email') ->sortable() ->searchable(), TextColumn::make('phone') ->label('Nomor Telepon') ->sortable(), TextColumn::make('created_at') ->label('Dibuat Pada') ->date() ->sortable(), ]); } Pada tabel pelanggan: name, email, dan phone dapat diurutkan dan dicari.created_at menampilkan tanggal pendaftaran pelanggan. 5. Menampilkan Data pada TransactionResource Tabel Transactions akan menampilkan nama pelanggan, nama produk, jumlah produk yang dibeli, dan waktu transaksi. Contoh Penggunaan $table pada TransactionResource public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('customer.name') ->label('Nama Pelanggan') ->sortable() ->searchable(), TextColumn::make('product.name') ->label('Nama Produk') ->sortable(), TextColumn::make('quantity') ->label('Jumlah') ->sortable(), TextColumn::make('created_at') ->label('Tanggal Transaksi') ->date() ->sortable(), ]); } Pada tabel transaksi: customer.name dan product.name akan menampilkan nama pelanggan dan produk yang terkait, dengan relasi ke tabel Customers dan Products.quantity menampilkan jumlah produk yang dibeli.created_at menampilkan tanggal transaksi. Dengan menggunakan $table pada setiap Filament Resource, kita bisa menampilkan data dari database dengan cara yang interaktif dan mudah digunakan. Fitur sortable dan searchable memudahkan pengguna dalam mengelola data, sementara fitur filters memberikan opsi untuk memfilter data berdasarkan relasi atau kondisi tertentu. Hal ini sangat berguna untuk proyek-proyek yang melibatkan banyak data seperti toko baju online. Cara Lengkap Mengupload Proyek Laravel ke Shared Hosting Hostinger.com Jika Anda telah menyelesaikan proyek Laravel 11 dan siap menguploadnya ke shared hosting seperti Hostinger.com, berikut ini adalah langkah-langkah lengkap yang perlu Anda ikuti untuk memastikan proyek berjalan dengan baik di server hosting Anda. Persiapan Sebelum Upload: Sebelum mengupload proyek Laravel, pastikan proyek sudah siap dengan hal-hal berikut: Semua dependensi yang diperlukan telah diatur.Database lokal sudah disiapkan dan diverifikasi.Proyek telah diuji di lingkungan lokal untuk memastikan tidak ada bug atau kesalahan besar. Langkah-Langkah Mengupload Proyek Laravel ke Shared Hosting Hostinger: 1. Zip Semua File Proyek Laravel Pertama, zip seluruh file proyek Laravel Anda, kecuali folder vendor dan node_modules. Kedua folder ini bisa dibuat ulang di server hosting, sehingga tidak perlu disertakan dalam file zip untuk menghemat waktu dan ruang penyimpanan. Cara zip file proyek: Pilih seluruh file proyek di folder lokal Anda kecuali vendor dan node_modules.Klik kanan dan pilih opsi untuk Compress atau Zip file.Simpan file hasil kompresi ini dengan nama yang sesuai, misalnya toko-baju.zip. 2. Upload File Zip ke Hosting Menggunakan File Manager atau FTP Ada dua cara untuk mengupload file zip proyek Laravel Anda ke Hostinger: menggunakan File Manager di cPanel Hostinger atau menggunakan FTP Client seperti FileZilla. Metode 1: Menggunakan File Manager Login ke akun Hostinger Anda.Buka hPanel (Hostinger Panel) dan cari opsi File Manager.Masuk ke direktori public_html.Klik tombol Upload dan unggah file zip yang telah Anda buat tadi. Metode 2: Menggunakan FTP (FileZilla) Buka FileZilla atau FTP client lainnya.Masukkan detail akun FTP yang bisa Anda dapatkan dari hPanel Hostinger, termasuk hostname, username, password, dan port.Setelah terhubung, masuk ke direktori public_html.Drag-and-drop file zip proyek ke direktori tersebut. 3. Ekstrak File Zip di Direktori public_html Setelah file zip selesai diupload, langkah berikutnya adalah mengekstrak file tersebut di direktori public_html. Di File Manager, cari file zip proyek Laravel yang sudah diupload.Klik kanan pada file tersebut dan pilih Extract.Ekstrak semua file ke dalam direktori public_html. 4. Jalankan Perintah composer install di Terminal Hosting Setelah semua file diunggah dan diekstrak, Anda harus menjalankan perintah composer install untuk mengunduh semua dependensi yang dibutuhkan oleh Laravel. Di hPanel, buka menu Hosting.Cari opsi SSH Access di Hostinger dan aktifkan jika belum diaktifkan.Gunakan SSH Terminal (bisa dari command prompt atau terminal di lokal Anda) untuk masuk ke server Hostinger menggunakan detail akses SSH Anda.Setelah berhasil masuk, arahkan terminal Anda ke direktori public_html: cd public_htmlJalankan perintah berikut untuk menginstall semua dependensi yang diperlukan: composer installTunggu hingga proses selesai. Composer akan membuat folder vendor yang berisi semua dependensi Laravel. 5. Edit File .env untuk Konfigurasi Hosting Selanjutnya, Anda perlu mengedit file .env yang berisi pengaturan konfigurasi proyek Laravel, seperti detail database, URL proyek, dan lain-lain. Buka File Manager di hPanel dan cari file .env di dalam direktori public_html.Edit file .env untuk menyesuaikan pengaturan proyek dengan environment hosting Anda, seperti mengatur database dan URL. Contoh konfigurasi yang mungkin perlu disesuaikan: APP_NAME=TokoBaju APP_ENV=production APP_KEY=base64:APP_KEY_ANDA APP_URL=https://domainanda.com DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=username_database DB_PASSWORD=password_database Catatan: Anda bisa mendapatkan detail database di bagian MySQL Databases di hPanel Hostinger. 6. Atur Permissions untuk Folder Storage dan Bootstrap Cache Setelah mengupload file dan mengedit file .env, Anda perlu mengatur permission pada folder storage dan bootstrap/cache agar Laravel dapat menulis ke dalam folder tersebut. Jalankan perintah berikut di terminal SSH: chmod -R 775 storage chmod -R 775 bootstrap/cache Perintah ini akan memberi Laravel izin untuk menulis dan mengakses folder yang diperlukan. 7. Jalankan Migrasi Database Jika proyek Anda menggunakan database, langkah berikutnya adalah menjalankan migrasi untuk membuat tabel di database yang sudah disiapkan. Pastikan Anda sudah membuat database melalui MySQL Databases di hPanel.Setelah database dibuat dan file .env sudah dikonfigurasi dengan benar, jalankan perintah migrasi berikut melalui terminal SSH: php artisan migrate Perintah ini akan membuat tabel di database sesuai dengan file migrasi yang ada di proyek Anda. 8. Setel Akses Domain dan Public Folder Pada shared hosting, public folder Laravel harus diarahkan ke folder public. Secara default, root direktori Hostinger adalah public_html, namun kita perlu mengarahkan agar hanya folder public yang menjadi root proyek Laravel. Buat file baru bernama .htaccess di dalam folder public_html.Masukkan konfigurasi berikut untuk mengarahkan semua request ke folder public: <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule> Konfigurasi ini akan mengarahkan semua akses dari domain utama ke folder public di proyek Laravel. Mengupload proyek Laravel 11 ke shared hosting Hostinger.com membutuhkan beberapa langkah penting, mulai dari mengupload file, menjalankan perintah Composer, hingga mengatur permission dan menjalankan migrasi. Dengan mengikuti langkah-langkah di atas, Anda akan dapat menghosting proyek Laravel Anda dengan mudah dan memastikan bahwa aplikasi berjalan dengan baik di lingkungan shared hosting. Ilmu Penting Lainnya untuk Dipelajari Berikut beberapa ilmu penting yang perlu dipelajari oleh programmer pemula untuk meningkatkan kemampuan mereka dalam web development menggunakan Laravel: Middleware: Mengontrol akses ke bagian tertentu dari aplikasi.Service Container: Mengatur dependency injection dan memudahkan pengelolaan class dalam aplikasi.Event dan Listener: Membuat aplikasi lebih modular dengan pemisahan logika.Queue: Memproses pekerjaan dalam antrian untuk meningkatkan performa aplikasi.Testing: Penting untuk memastikan aplikasi bekerja sesuai ekspektasi. Belajar dari Mentor BuildWithAngga Programmer pemula bisa mendapatkan manfaat besar dengan belajar dari mentor BuildWithAngga. Beberapa benefit yang bisa diperoleh: Akses seumur hidup ke semua materi belajar.Bonus konsultasi dengan mentor yang berpengalaman.Grup diskusi antar siswa untuk saling bertukar ilmu dan pengalaman.Persiapan kerja yang lebih matang, dengan materi yang disesuaikan dengan kebutuhan industri. Belajar dari mentor akan membantu mempercepat proses belajar, memberikan insight yang berguna, dan memastikan Anda mendapatkan pemahaman yang mendalam mengenai Laravel dan Filament. Dengan tutorial ini, Anda sekarang memiliki dasar yang kuat untuk membangun dashboard website toko baju yang modern dan kaya fitur menggunakan Laravel 11 dan Filament.

Kelas Tutorial Bikin Seeder dengan Laravel 11 Pada Projek Toko Kopi Online di BuildWithAngga

Tutorial Bikin Seeder dengan Laravel 11 Pada Projek Toko Kopi Online

Pada artikel ini, kita akan belajar cara menggunakan fitur seeder dan faker pada Laravel 11. Fitur ini sangat bermanfaat untuk mempercepat kinerja pengembangan website, terutama ketika kita perlu membuat data dummy atau data palsu untuk keperluan pengujian. Bayangkan jika kita harus mengisi data secara manual untuk setiap tabel di proyek kita—tentu sangat memakan waktu. Dengan seeder dan faker, kita bisa membuat data dengan cepat dan efisien. Kita akan membahas secara lengkap bagaimana cara membuat seeder dalam proyek toko kopi online yang memiliki tabel-tabel seperti categories, coffees, ingredients, dan transactions. Di dalam tutorial ini, akan dijelaskan langkah-langkah mulai dari membuat model, mengatur file migration, mengatur fillable pada model, mengatur relationship antar tabel, membuat seeder dan faker, serta menghubungkan proyek pada setting MySQL database lokal. Apa Itu Seeder dan Faker di Laravel? Sebelum kita masuk ke tahap teknis, mari kita pahami dulu apa itu seeder dan faker di Laravel. Seeder adalah fitur di Laravel yang memungkinkan kita untuk mengisi tabel database dengan data dummy secara otomatis. Ini sangat membantu saat kita butuh banyak data untuk pengujian, tanpa perlu menginput data secara manual satu per satu.Faker adalah library yang digunakan Laravel untuk menghasilkan data palsu. Dengan faker, kita bisa membuat berbagai tipe data, seperti nama, alamat, nomor telepon, tanggal, dan masih banyak lagi, dengan cepat dan otomatis. Langkah-Langkah Membuat Seeder di Laravel 11 untuk Proyek Toko Kopi Online Berikut adalah langkah-langkah lengkap untuk membuat seeder di proyek toko kopi online. Dalam proyek ini, kita akan bekerja dengan tabel categories, coffees, ingredients, dan transactions. Membuat Model dan Migration Langkah pertama adalah membuat model beserta migration-nya. Di Laravel, model mewakili struktur tabel dalam database dan migration digunakan untuk mendefinisikan kolom-kolom yang akan ada di dalam tabel tersebut. Buat model Category beserta migration dengan perintah berikut: php artisan make:model Category -m Perintah ini akan membuat file model di folder app/Models dan file migration di folder database/migrations. File migration ini nantinya akan digunakan untuk membuat tabel categories di database. Lakukan hal yang sama untuk Coffees, Ingredients, dan Transactions: php artisan make:model Coffee -m php artisan make:model Ingredient -m php artisan make:model Transaction -m 2. Mengatur File Migration Setelah file migration dibuat, langkah selanjutnya adalah mendefinisikan struktur tabel di masing-masing file migration. Contohnya, untuk tabel categories, buka file migration yang baru dibuat dan edit isinya menjadi seperti ini: public function up() { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); } Lakukan hal serupa untuk tabel coffees, ingredients, dan transactions. Contohnya, tabel coffees bisa memiliki struktur seperti ini: public function up() { Schema::create('coffees', function (Blueprint $table) { $table->id(); $table->string('name'); $table->foreignId('category_id')->constrained(); $table->decimal('price', 8, 2); $table->timestamps(); }); } Tabel coffees memiliki hubungan dengan categories melalui category_id, yang menunjukkan bahwa setiap kopi memiliki kategori. 3. Mengatur Fillable di Model Agar Laravel dapat melakukan mass-assignment (mengisi banyak data sekaligus), kita perlu mengatur properti fillable di model. Contoh untuk model Category: protected $fillable = ['name']; Untuk model Coffee: protected $fillable = ['name', 'category_id', 'price']; Lakukan hal yang sama untuk model Ingredient dan Transaction. 4. Mengatur Relationship Antar Tabel Selanjutnya, kita perlu mendefinisikan relationship antar tabel di model. Contohnya, di model Category, kita dapat mendefinisikan bahwa satu kategori bisa memiliki banyak kopi: public function coffees() { return $this->hasMany(Coffee::class); } Di model Coffee, kita bisa mendefinisikan bahwa setiap kopi berhubungan dengan satu kategori: public function category() { return $this->belongsTo(Category::class); } Untuk Ingredients dan Transactions, kita bisa menggunakan relasi many-to-many jika perlu, namun untuk sekarang, kita fokus pada relasi one-to-many antara categories dan coffees. 5. Membuat Seeder dan Faker Setelah model dan relationship diatur, saatnya membuat seeder. Seeder ini akan digunakan untuk mengisi tabel-tabel dengan data palsu. Laravel sudah menyediakan perintah untuk membuat seeder: php artisan make:seeder CategorySeeder Setelah itu, buka file seeder di folder database/seeders, dan gunakan faker untuk menghasilkan data palsu: use App\\\\Models\\\\Category; use Faker\\\\Factory as Faker; public function run() { $faker = Faker::create(); for ($i = 1; $i <= 10; $i++) { Category::create([ 'name' => $faker->word, ]); } } Lakukan hal yang sama untuk CoffeeSeeder, IngredientSeeder, dan TransactionSeeder. Contoh untuk CoffeeSeeder: use App\\\\Models\\\\Coffee; use App\\\\Models\\\\Category; use Faker\\\\Factory as Faker; public function run() { $faker = Faker::create(); $categories = Category::all(); foreach ($categories as $category) { for ($i = 1; $i <= 5; $i++) { Coffee::create([ 'name' => $faker->word, 'category_id' => $category->id, 'price' => $faker->randomFloat(2, 1, 10), ]); } } } 5. Menjalankan Migration Setelah kita selesai mengatur file migration, langkah berikutnya adalah menjalankan perintah migration untuk membuat tabel di database. Gunakan perintah berikut: php artisan migrate Perintah ini akan membuat semua tabel yang telah didefinisikan dalam file migration (categories, coffees, ingredients, dan transactions) di database MySQL lokal yang sudah terhubung. Pastikan konfigurasi database di file .env sudah benar agar proses migration berjalan lancar. 6. Menjalankan Seeder Setelah semua seeder dibuat, kita bisa menjalankannya dengan perintah berikut: php artisan db:seed --class=CategorySeeder php artisan db:seed --class=CoffeeSeeder php artisan db:seed --class=IngredientSeeder php artisan db:seed --class=TransactionSeeder Ini akan mengisi tabel categories, coffees, ingredients, dan transactions dengan data palsu. 7. Menghubungkan Proyek ke Database MySQL Lokal Agar seeder dapat berjalan, pastikan kita sudah menghubungkan proyek Laravel ke database MySQL lokal. Buka file .env dan atur konfigurasi database seperti berikut: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=toko_kopi DB_USERNAME=root DB_PASSWORD= Pastikan juga MySQL sudah berjalan di komputer lokal. Penutup Laravel terus berkembang menjadi salah satu framework web development yang paling populer di dunia karena berbagai update menarik yang dirilis secara berkala. Setiap pembaruan membawa fitur-fitur baru yang tidak hanya memudahkan para developer, tetapi juga mempercepat proses pengembangan aplikasi. Dari fitur keamanan yang semakin baik hingga peningkatan kinerja dan dokumentasi yang komprehensif, Laravel terus menjaga reputasinya sebagai framework yang aman, fleksibel, dan mudah dipelajari. Dengan kemudahan dan fleksibilitas yang ditawarkan, Laravel memungkinkan developer untuk membangun aplikasi skala kecil hingga besar dengan lebih cepat dan efisien. Selain itu, Laravel terus mendukung para developer dengan tools dan paket-paket yang terus diperbarui, sehingga memudahkan untuk menangani berbagai kebutuhan proyek, dari pengelolaan database, otentikasi, hingga pengembangan API. Bagi Anda yang ingin terus memperdalam ilmu Laravel atau bahkan belajar framework ini dari nol, Buildwithangga adalah tempat yang tepat. Mereka secara rutin menghadirkan kelas-kelas gratis dengan studi kasus nyata yang dapat langsung diterapkan dalam proyek Anda. Studi kasus ini membantu Anda memahami cara mengimplementasikan Laravel dalam skenario kehidupan nyata, sehingga Anda lebih siap dalam menghadapi tantangan proyek web development sesungguhnya. Selain itu, Buildwithangga juga menawarkan akses kelas seumur hidup yang memberikan Anda kebebasan untuk belajar kapan saja tanpa batasan waktu. Anda juga dapat belajar dari mentor berpengalaman yang siap membimbing dan menjawab pertanyaan Anda di sepanjang proses belajar. Dengan adanya fitur diskusi kelompok, Anda juga bisa bertukar pikiran dengan sesama pelajar, meningkatkan pemahaman Anda tentang topik yang sedang dipelajari. Pantau terus website Buildwithangga untuk tidak ketinggalan update kelas terbaru dan kesempatan belajar gratis yang bisa membantu meningkatkan skill Anda sebagai developer Laravel. Ini adalah langkah tepat untuk mengembangkan karir Anda di bidang web development dan menjadi lebih siap menghadapi berbagai proyek teknologi yang lebih kompleks di masa depan.

Kelas Tutorial Bikin RBAC dengan Spatie Permission dan Laravel 11 Projek Website Desa Online di BuildWithAngga

Tutorial Bikin RBAC dengan Spatie Permission dan Laravel 11 Projek Website Desa Online

Di era digital seperti sekarang, website desa memiliki peran yang sangat penting dalam mengelola dan mendukung pertumbuhan ekonomi desa. Dengan adanya website desa, semua informasi terkait perkembangan ekonomi, kegiatan masyarakat, layanan publik, serta peluang usaha di desa bisa disebarluaskan secara lebih cepat dan efisien. Website desa juga berfungsi sebagai jembatan untuk meningkatkan transparansi dan keterlibatan warga dalam pengambilan keputusan di tingkat lokal. Selain itu, website desa dapat menjadi media untuk mempromosikan produk lokal atau pariwisata desa, yang pada akhirnya akan meningkatkan perekonomian desa tersebut. Fitur Penting dalam Pengelolaan Website Desa Ada beberapa fitur penting yang harus ada dalam website pengelolaan desa untuk memastikan fungsionalitas dan kemudahan penggunaan. Beberapa fitur tersebut antara lain: Layanan Informasi Publik: Informasi terkait administrasi desa, layanan kependudukan, serta pengumuman resmi dari pemerintah desa.Toko Online: Tempat warga desa memasarkan produk-produk lokal seperti kerajinan tangan, makanan khas, dan sebagainya.Manajemen Acara: Untuk mengelola berbagai acara dan kegiatan yang diadakan di desa, baik acara tradisional, olahraga, maupun kegiatan sosial.Sistem Pengelolaan Pengguna: Pengaturan hak akses berdasarkan peran seperti admin desa, perangkat desa, warga desa, dan pengunjung.Struktur Organisasi: Menampilkan struktur pemerintahan desa dan organisasi terkait lainnya untuk meningkatkan transparansi. Membangun Website Desa dengan Laravel 11 Laravel 11 adalah pilihan yang tepat untuk membangun website desa karena framework ini menyediakan berbagai fitur yang memudahkan dalam pengembangan website secara cepat, aman, dan scalable. Dengan fitur-fitur seperti authentication, authorization, dan integrasi yang baik dengan berbagai package, Laravel 11 memungkinkan kita membangun fitur-fitur seperti Role-Based Access Control (RBAC) dengan cepat dan efisien. Salah satu package yang sangat populer untuk menangani RBAC adalah Spatie Permission. Implementasi Lengkap RBAC dengan Spatie Permission di Laravel 11 untuk Website Desa Dalam mengimplementasikan Role-Based Access Control (RBAC) dengan Spatie Permission pada proyek website desa, kita akan melalui beberapa tahapan, mulai dari membuat model yang dibutuhkan, menambahkan field-field pada migrations, mengatur relationship antar model, menggunakan factory dan seeder, serta penerapan middleware pada navigasi yang berbeda untuk setiap role dan fitur. 1. Install Laravel dan Spatie Permission Pertama, kita perlu menginstal Laravel 11 dan package Spatie Permission: composer require spatie/laravel-permission Setelah itu, kita jalankan perintah untuk mempublikasi file konfigurasi dan migrasi dari Spatie: php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider" php artisan migrate 2. Membuat Model dan Migrations untuk Proyek Dalam proyek ini, kita akan membuat beberapa model dan tabel, yaitu users, online_stores, events, roles, dan structure_of_people. Setiap model ini akan memiliki field-field khusus yang disesuaikan dengan kebutuhan website desa. a. Membuat Model User Laravel sudah menyediakan model User secara default. Namun, kita perlu menambahkan relasi dengan role dan permission. // User.php use Spatie\\\\Permission\\\\Traits\\\\HasRoles; class User extends Authenticatable { use HasRoles; protected $fillable = [ 'name', 'email', 'password', ]; public function stores() { return $this->hasMany(OnlineStore::class); } public function events() { return $this->hasMany(Event::class); } } b. Membuat Model OnlineStore php artisan make:model OnlineStore -m Pada migration OnlineStore, kita akan menambahkan field user_id untuk relasi one-to-many antara user dan toko online. // create_online_stores_table.php Schema::create('online_stores', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('user_id'); $table->string('store_name'); $table->text('description'); $table->timestamps(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); Kemudian di model OnlineStore, kita tambahkan relasi ke model User. // OnlineStore.php class OnlineStore extends Model { protected $fillable = ['user_id', 'store_name', 'description']; public function user() { return $this->belongsTo(User::class); } } c. Membuat Model Event php artisan make:model Event -m Pada migration Event, kita tambahkan field user_id untuk relasi one-to-many. // create_events_table.php Schema::create('events', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('user_id'); $table->string('event_name'); $table->date('event_date'); $table->timestamps(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); Di model Event, tambahkan relasi ke model User. // Event.php class Event extends Model { protected $fillable = ['user_id', 'event_name', 'event_date']; public function user() { return $this->belongsTo(User::class); } } d. Membuat Model StructureOfPeople php artisan make:model StructureOfPeople -m Pada migration StructureOfPeople, kita tambahkan field yang relevan. // create_structure_of_people_table.php Schema::create('structure_of_people', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('position'); $table->timestamps(); }); Kemudian di model StructureOfPeople: // StructureOfPeople.php class StructureOfPeople extends Model { protected $fillable = ['name', 'position']; } 3. Mengatur Relationship pada Setiap Model Setiap model sudah diatur untuk memiliki relasi one-to-many sesuai dengan struktur yang diperlukan di website desa. User memiliki banyak OnlineStore.User memiliki banyak Event. 4. Menggunakan Factory dan Seeder a. Factory untuk User Kita bisa membuat factory untuk model User untuk menghasilkan data dummy: php artisan make:factory UserFactory --model=User Isi UserFactory dengan contoh data berikut: // UserFactory.php public function definition() { return [ 'name' => $this->faker->name(), 'email' => $this->faker->unique()->safeEmail(), 'password' => bcrypt('password'), ]; } b. Seeder untuk User, Role, dan Permission Selanjutnya, kita buat seeder untuk menambahkan data pengguna beserta role dan permission: php artisan make:seeder RolePermissionSeeder Isi RolePermissionSeeder sebagai berikut: // RolePermissionSeeder.php use Spatie\\\\Permission\\\\Models\\\\Role; use Spatie\\\\Permission\\\\Models\\\\Permission; public function run() { // Membuat roles Role::create(['name' => 'admin_desa']); Role::create(['name' => 'perangkat_desa']); Role::create(['name' => 'warga_desa']); Role::create(['name' => 'pengunjung']); // Membuat permissions Permission::create(['name' => 'manage_online_store']); Permission::create(['name' => 'manage_events']); Permission::create(['name' => 'manage_structure']); // Menambahkan role dan permission ke user $admin = User::factory()->create(); $admin->assignRole('admin_desa'); } Jalankan seeder: php artisan db:seed --class=RolePermissionSeeder 5. Penerapan Middleware dan Navigasi Berdasarkan Role Sekarang kita bisa menerapkan middleware untuk membatasi akses berdasarkan role dan permission. Route::group(['middleware' => ['role:admin_desa']], function() { Route::get('/admin/dashboard', [AdminController::class, 'index']); Route::get('/admin/stores', [StoreController::class, 'index']); Route::get('/admin/events', [EventController::class, 'index']); }); Route::group(['middleware' => ['role:warga_desa']], function() { Route::get('/warga/stores', [StoreController::class, 'manageOwn']); Route::get('/warga/events', [EventController::class, 'create']); }); Dengan middleware ini, hanya admin_desa yang dapat mengakses seluruh toko dan acara, sementara warga_desa hanya dapat mengelola toko dan acara milik mereka sendiri. 5 Kesalahan Umum dalam Implementasi RBAC dengan Spatie Laravel 11 Tidak Memahami Perbedaan antara Roles dan Permissions: Beberapa developer sering menyamakan role dan permission. Padahal, role adalah sekumpulan izin (permissions) yang diberikan kepada pengguna, sementara permission adalah izin spesifik yang mengatur akses ke fitur tertentu. Role dapat berisi beberapa permissions dan dapat diberikan kepada banyak pengguna. Contoh kode: // Membuat role dan permission secara terpisah use Spatie\\\\Permission\\\\Models\\\\Role; use Spatie\\\\Permission\\\\Models\\\\Permission; // Membuat role Role::create(['name' => 'admin_desa']); // Membuat permission Permission::create(['name' => 'manage_online_store']); // Memberikan permission ke role $role = Role::findByName('admin_desa'); $role->givePermissionTo('manage_online_store'); Mengabaikan Middleware untuk Mengamankan Route: Salah satu kesalahan umum adalah tidak menerapkan middleware yang membatasi akses berdasarkan role atau permission. Middleware ini sangat penting untuk memastikan pengguna hanya dapat mengakses fitur yang sesuai dengan hak akses mereka. Contoh kode: Route::group(['middleware' => ['role:admin_desa']], function() { Route::get('/admin/dashboard', [AdminController::class, 'index']); }); Route::group(['middleware' => ['permission:manage_online_store']], function() { Route::get('/store/manage', [StoreController::class, 'manage']); }); Tidak Menggunakan Cache Permissions: Setiap kali aplikasi memeriksa role atau permission, aplikasi melakukan query ke database. Hal ini bisa memperlambat performa jika tidak menggunakan caching. Developer sering lupa untuk mengaktifkan caching yang disediakan oleh Spatie Permission. Contoh kode untuk mengaktifkan caching: // Menjalankan command untuk cache role dan permission php artisan permission:cache-reset Hardcoding Role dan Permission di Controller: Mengatur role dan permission langsung di controller tanpa menggunakan mekanisme yang lebih fleksibel dapat menyebabkan kesulitan maintenance di masa depan. Sebaiknya, role dan permission dikelola melalui seeder atau command. Contoh kesalahan: public function index() { if (auth()->user()->role != 'admin_desa') { abort(403, 'Akses ditolak'); } } Solusi: public function index() { if (!auth()->user()->hasRole('admin_desa')) { abort(403, 'Akses ditolak'); } } Tidak Melakukan Testing pada Fitur RBAC: Banyak developer tidak melakukan pengujian (testing) yang cukup untuk memastikan bahwa fitur RBAC berfungsi dengan baik. Pengujian sangat penting, terutama ketika ada perubahan pada role atau permission, untuk memastikan aplikasi tetap aman. Contoh kode untuk pengujian: public function test_admin_can_access_dashboard() { $admin = User::factory()->create(); $admin->assignRole('admin_desa'); $response = $this->actingAs($admin)->get('/admin/dashboard'); $response->assertStatus(200); } public function test_non_admin_cannot_access_dashboard() { $user = User::factory()->create(); $response = $this->actingAs($user)->get('/admin/dashboard'); $response->assertStatus(403); } Dengan menghindari kesalahan-kesalahan ini, developer dapat memastikan implementasi RBAC berjalan dengan baik dan aman. Belajar Lebih Lanjut dengan Buildwithangga Jika Anda ingin memperdalam pengetahuan tentang Laravel dan fitur-fitur penting lainnya dalam pengembangan web, Buildwithangga adalah pilihan tepat. Di sini, Anda akan mendapatkan akses ke kursus berkualitas dengan berbagai manfaat yang mendukung perjalanan belajar Anda. Dengan akses seumur hidup, Anda bisa belajar kapan saja tanpa batasan waktu, menjadikan pembelajaran fleksibel sesuai dengan kesibukan Anda. Selain itu, bonus konsultasi dengan mentor memungkinkan Anda bertanya langsung kepada para ahli, mempercepat pemahaman tentang topik yang sedang dipelajari. Tidak hanya itu, grup diskusi antar siswa memberikan kesempatan untuk berdiskusi, berbagi pengalaman, dan memecahkan masalah secara kolaboratif dengan sesama pelajar. Persiapan Anda dalam menghadapi dunia kerja juga akan semakin matang dengan dukungan persiapan kerja yang disediakan oleh Buildwithangga. Kursus ini dirancang untuk memberikan keterampilan praktis yang dicari oleh perusahaan, membuat portofolio yang menarik, dan meningkatkan peluang karir Anda sebagai web developer profesional. Dengan pembelajaran yang terstruktur dan materi yang selalu up-to-date, Anda akan lebih siap untuk menghadapi tantangan dan menjadi lebih kompetitif di pasar kerja. Mulailah perjalanan Anda bersama Buildwithangga, dan buat portofolio proyek nyata yang dapat menunjukkan kemampuan Anda dalam pengembangan web.

Kelas Belajar Bikin Relasi Database One to Many dengan Laravel 11 Projek Order Coffee di BuildWithAngga

Belajar Bikin Relasi Database One to Many dengan Laravel 11 Projek Order Coffee

Membangun sebuah website yang baik tidak hanya tentang tampilan yang menarik, tetapi juga tentang bagaimana data di dalamnya dikelola. Salah satu aspek terpenting dalam pengelolaan data adalah desain database. Database yang didesain dengan baik akan mempermudah proses maintenance dan memperbesar skala sistem di masa depan. Salah satu cara terbaik untuk mengelola data di dalam database adalah dengan memahami dan menggunakan relasi antar tabel, seperti One to Many. Dalam artikel ini, kita akan membahas tentang cara membangun relasi One to Many menggunakan Laravel 11. Selain itu, kita juga akan melihat contoh implementasi pada proyek website pemesanan kopi, serta membahas beberapa kesalahan umum yang sering terjadi ketika mengatur relasi tabel. Artikel ini ditulis dengan gaya yang mudah dipahami, sehingga cocok untuk pemula yang baru belajar Laravel maupun programmer yang ingin mengasah kembali pengetahuan mereka. Pentingnya Menyimpan Data dengan Baik dalam Database Ketika kita mengembangkan sebuah website, terutama yang bersifat dinamis, kita seringkali perlu menyimpan data penting untuk memberikan pengalaman pengguna yang lebih baik. Misalnya, pada sebuah website pemesanan kopi, kita perlu menyimpan data pelanggan, kategori kopi, lokasi toko, dan berbagai informasi lainnya agar pengguna dapat melakukan pemesanan dengan mudah. Database adalah solusi yang ideal untuk menyimpan semua data tersebut secara terstruktur dan mudah diakses. Dengan menyimpan data secara benar, kita bisa memudahkan pengguna dalam berinteraksi dengan sistem, seperti mencari produk yang diinginkan, melihat kategori tertentu, atau menemukan lokasi toko terdekat. Apa Itu Relasi One to Many? Relasi One to Many adalah salah satu jenis relasi dalam database yang menunjukkan bahwa satu entitas dapat memiliki banyak entitas lain yang terkait dengannya. Contohnya, dalam sebuah website pemesanan kopi, satu kategori kopi bisa memiliki banyak produk kopi. Dengan kata lain, setiap kategori (satu) bisa memiliki beberapa produk kopi (banyak). Mari kita lihat bagaimana cara mengimplementasikan relasi One to Many menggunakan Laravel 11. Implementasi Relasi One to Many di Laravel 11 Di Laravel, kita dapat mengelola relasi antar tabel dengan sangat mudah menggunakan Eloquent ORM. Mari kita implementasikan relasi One to Many pada proyek Order Coffee. Misalkan kita memiliki tabel-tabel berikut: customers: Menyimpan data pelanggan.categories: Menyimpan data kategori kopi.coffees: Menyimpan data produk kopi.beverages: Menyimpan data minuman selain kopi.store_locations: Menyimpan data lokasi toko. Kita akan fokus pada relasi antara categories dan coffees. Setiap kategori bisa memiliki banyak produk kopi, dan setiap produk kopi hanya bisa masuk ke satu kategori. Langkah 1: Membuat Model dan Migrasi Pertama-tama, kita perlu membuat model dan migrasi untuk tabel categories dan coffees. php artisan make:model Category -m php artisan make:model Coffee -m Migrasi untuk tabel categories mungkin akan terlihat seperti ini: Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); Sedangkan migrasi untuk tabel coffees: Schema::create('coffees', function (Blueprint $table) { $table->id(); $table->string('name'); $table->foreignId('category_id')->constrained()->onDelete('cascade'); $table->timestamps(); }); Dalam tabel coffees, kita menambahkan kolom category_id untuk menyimpan referensi ke tabel categories. Kolom ini juga diberi foreign key constraint agar relasi tetap konsisten. Langkah 2: Menentukan Relasi di Model Setelah migrasi selesai, kita bisa mendefinisikan relasi di model. Di model Category, kita tambahkan fungsi berikut untuk menunjukkan bahwa kategori memiliki banyak produk kopi. class Category extends Model { public function coffees() { return $this->hasMany(Coffee::class); } } Sedangkan di model Coffee, kita tambahkan fungsi berikut untuk menunjukkan bahwa produk kopi hanya memiliki satu kategori. class Coffee extends Model { public function category() { return $this->belongsTo(Category::class); } } Langkah 3: Menggunakan Relasi di Controller Setelah relasi didefinisikan, kita bisa mulai menggunakan relasi ini di controller. Misalnya, untuk menampilkan semua kopi dari kategori tertentu, kita bisa menggunakan relasi yang sudah kita buat. $category = Category::find(1); $coffees = $category->coffees; foreach ($coffees as $coffee) { echo $coffee->name; } Di sini, kita mengambil kategori dengan ID 1 dan kemudian mengambil semua produk kopi yang ada di kategori tersebut. Kesalahan Umum dalam Mengatur Relasi Tabel Meskipun Laravel mempermudah pengaturan relasi antar tabel, ada beberapa kesalahan umum yang sering dilakukan oleh programmer, terutama bagi yang baru belajar. 1. Lupa Menambahkan Foreign Key Salah satu kesalahan paling umum adalah tidak menambahkan foreign key di tabel yang seharusnya memiliki relasi. Sebagai contoh, jika kita lupa menambahkan foreign key di tabel coffees, maka relasi antara categories dan coffees tidak akan berjalan dengan baik. Contoh kesalahan: Schema::create('coffees', function (Blueprint $table) { $table->id(); $table->string('name'); // Lupa menambahkan category_id sebagai foreign key $table->timestamps(); }); 2. Tidak Menangani Cascade Delete Saat mendesain relasi One to Many, penting untuk menangani penghapusan data dengan benar. Jika kita tidak menggunakan cascade delete, maka saat kita menghapus sebuah kategori, produk kopi yang terkait dengannya tidak akan terhapus, dan ini dapat menyebabkan data yang tidak konsisten. Contoh kesalahan: Schema::create('coffees', function (Blueprint $table) { $table->id(); $table->string('name'); $table->foreignId('category_id')->constrained(); // Lupa menambahkan onDelete('cascade') $table->timestamps(); }); 3. Tidak Menggunakan Eager Loading Kesalahan lainnya adalah tidak menggunakan eager loading saat mengambil data yang memiliki relasi. Ini bisa menyebabkan n+1 query problem, di mana aplikasi mengirimkan terlalu banyak query ke database, sehingga memperlambat performa. Contoh kesalahan: $categories = Category::all(); foreach ($categories as $category) { // Ini akan mengirimkan query tambahan untuk setiap kategori foreach ($category->coffees as $coffee) { echo $coffee->name; } } Solusi yang benar adalah menggunakan eager loading: $categories = Category::with('coffees')->get(); foreach ($categories as $category) { foreach ($category->coffees as $coffee) { echo $coffee->name; } } Belajar Lebih Lanjut dengan Buildwithangga Jika kamu serius ingin memperdalam pengetahuan tentang Laravel dan memahami cara mengelola database dengan optimal, Buildwithangga adalah tempat yang tepat untuk memulai. Platform ini menyediakan berbagai kelas yang dirancang untuk mencakup semua level kemampuan, mulai dari pemula yang baru terjun ke dunia pemrograman hingga developer berpengalaman yang ingin memperbarui skill mereka. Di Buildwithangga, kamu tidak hanya mendapatkan materi yang lengkap dan terstruktur, tetapi juga berbagai keuntungan lain yang akan membantu mempercepat proses belajar kamu. Berikut ini beberapa manfaat yang bisa kamu dapatkan: Akses Seumur Hidup ke Semua Materi: Setiap materi yang sudah kamu pelajari akan tetap bisa diakses kapan saja tanpa batas waktu. Ini memungkinkan kamu untuk belajar dengan ritme sendiri, tanpa tekanan waktu, serta mengulang kembali pelajaran jika diperlukan.Konsultasi Bonus dengan Mentor Berpengalaman: Salah satu fitur unggulan dari Buildwithangga adalah kesempatan untuk berkonsultasi langsung dengan mentor yang ahli di bidangnya. Kamu bisa mendapatkan feedback personal, menyelesaikan masalah coding yang kompleks, dan mendapatkan wawasan industri dari para profesional.Grup Diskusi dengan Sesama Pelajar: Di samping akses ke materi, kamu juga akan bergabung dengan komunitas belajar yang solid. Grup diskusi ini memungkinkan kamu untuk bertukar ide, berbagi pengalaman, dan belajar bersama dengan pelajar lain. Belajar dalam komunitas sering kali mempercepat proses pemahaman dan membuat proses belajar menjadi lebih interaktif dan menyenangkan.Persiapan Kerja Lebih Matang: Materi yang diajarkan di Buildwithangga disesuaikan dengan kebutuhan industri saat ini. Kamu akan belajar keterampilan yang relevan untuk pasar kerja, termasuk implementasi proyek nyata dan studi kasus. Dengan mengikuti kelas ini, kamu akan lebih siap menghadapi tantangan dunia kerja dan mampu bersaing di industri pengembangan web. Buildwithangga tidak hanya memberikan materi pembelajaran, tetapi juga memberikan pengalaman belajar yang terarah dan menyeluruh. Dengan mentor berpengalaman dan komunitas pendukung, kamu bisa mengembangkan kemampuan coding dengan cepat, menyelesaikan tantangan proyek, dan siap menjadi developer yang kompetitif di pasar kerja yang semakin ketat. Jadi, tunggu apa lagi? Bergabunglah dengan Buildwithangga, nikmati akses ke semua manfaat ini, dan tingkatkan karier kamu sebagai developer profesional yang handal.

Kelas Tutorial Bikin RBAC dengan Laravel 11 Pada Projek Toko Obat di BuildWithAngga

Tutorial Bikin RBAC dengan Laravel 11 Pada Projek Toko Obat

Pelajari cara menerapkan Role-Based Access Control (RBAC) di Laravel 11 dengan efektif untuk website toko obat. Tutorial ini menjelaskan langkah-langkah menggunakan package Spatie Role Permission, memberikan contoh kode lengkap untuk setiap peran pengguna seperti pemilik toko, kasir, customer, dan penulis artikel, serta membahas kesalahan umum yang perlu dihindari dalam penerapan RBAC. Membangun website toko obat tentunya bukan pekerjaan yang mudah. Ada banyak fitur yang perlu disiapkan, dan setiap pengguna memiliki peran serta akses yang berbeda-beda. Misalnya, pemilik toko dapat mengelola seluruh operasional, kasir memiliki akses untuk transaksi, customer hanya dapat melihat dan membeli produk, sedangkan penulis artikel bertanggung jawab dalam menulis konten untuk promosi atau edukasi. Fitur-fitur ini bisa kita kelola menggunakan RBAC (Role-Based Access Control) di Laravel 11. Mengapa RBAC Penting di Website Toko Obat? Setiap toko obat online tentu memiliki banyak pengguna dengan tugas yang berbeda-beda. Berikut adalah beberapa contoh fitur yang berbeda berdasarkan peran pengguna: Pemilik Toko: Mengelola produk, mengawasi transaksi, melihat laporan penjualan, dan mengatur hak akses pengguna lain.Kasir Toko: Melakukan transaksi penjualan, mencetak struk, dan melihat riwayat transaksi.Customer: Melihat produk, menambahkan produk ke keranjang, dan melakukan pembelian.Penulis Artikel: Menulis dan mempublikasikan artikel mengenai produk baru, tips kesehatan, dan promo. Dengan RBAC, kita dapat memastikan bahwa setiap pengguna hanya bisa mengakses fitur yang relevan dengan peran mereka. Misalnya, kasir tidak perlu memiliki akses ke pengaturan stok atau artikel, dan penulis artikel tidak perlu mengelola transaksi. Penerapan RBAC Menggunakan Laravel 11 Laravel 11 memungkinkan kita menerapkan RBAC dengan mudah menggunakan sistem authorization-nya. Kamu bisa menggunakan middleware dan gate untuk mengatur peran pengguna dalam aplikasi. Namun, jika kamu ingin solusi yang lebih cepat, kamu bisa menggunakan package Spatie Laravel Permission yang sangat populer dan mudah diterapkan. Cara Menggunakan Spatie Role Permission di Laravel 11 Berikut langkah-langkah sederhana untuk menerapkan RBAC di Laravel 11 menggunakan package Spatie Role Permission: Instal Package Spatie: Kamu bisa menginstal package ini melalui composer: composer require spatie/laravel-permission Publikasikan Config dan Migrate: Setelah menginstal package, kamu perlu mempublikasikan konfigurasi dan menjalankan migrasi. php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider" php artisan migrate Menambahkan Peran dan Hak Akses: Dalam contoh projek toko obat, kamu bisa membuat beberapa peran dan memberikan hak akses yang sesuai. Misalnya: use Spatie\\\\Permission\\\\Models\\\\Role; use Spatie\\\\Permission\\\\Models\\\\Permission; // Membuat peran $owner = Role::create(['name' => 'pemilik toko']); $cashier = Role::create(['name' => 'kasir toko']); $customer = Role::create(['name' => 'customer']); $writer = Role::create(['name' => 'penulis artikel']); // Menambahkan hak akses Permission::create(['name' => 'manage products']); Permission::create(['name' => 'manage transactions']); Permission::create(['name' => 'write articles']); Assign Peran ke Pengguna: Setelah peran dan hak akses dibuat, kamu bisa mengassign peran tersebut ke pengguna. $user = User::find(1); // Ambil user berdasarkan ID $user->assignRole('pemilik toko'); // Assign peran pemilik toko ke user Mengatur Middleware: Untuk membatasi akses berdasarkan peran, kamu bisa menambahkan middleware pada route. Route::group(['middleware' => ['role:pemilik toko']], function () { Route::get('/manage-products', 'ProductController@index'); }); Dengan langkah-langkah ini, RBAC sudah berjalan di website toko obat kamu. Setiap pengguna hanya bisa mengakses fitur yang sesuai dengan perannya. Contoh Penerapan RBAC Pada Toko Obat Mari kita eksplorasi lebih jauh bagaimana penerapan Role-Based Access Control (RBAC) dalam website toko obat dengan berbagai peran pengguna: pemilik toko, kasir, customer, dan penulis artikel. Setiap peran ini memiliki akses yang berbeda tergantung pada fungsinya dalam sistem. Kita akan menggunakan Laravel 11 dengan package Spatie Laravel Permission. 1. Pemilik Toko Sebagai pemilik toko, pengguna memiliki akses penuh ke seluruh fitur website, seperti mengelola produk, melihat laporan penjualan, mengatur hak akses pengguna lain, dan sebagainya. Pemilik toko biasanya memiliki kontrol penuh atas sistem. Contoh lengkap penerapan kode untuk pemilik toko di controller: use Spatie\\\\Permission\\\\Models\\\\Role; use Spatie\\\\Permission\\\\Models\\\\Permission; class OwnerController extends Controller { public function __construct() { // Memastikan user memiliki role pemilik toko $this->middleware(['role:pemilik toko']); } public function index() { // Memastikan user memiliki izin untuk mengelola produk $this->authorize('manage products'); // Logika untuk menampilkan dashboard pemilik toko return view('owner.dashboard', [ 'products' => Product::all(), 'salesReport' => Sale::getMonthlyReport() ]); } public function manageUsers() { // Mengelola hak akses pengguna lain $this->authorize('manage users'); return view('owner.manage_users', [ 'users' => User::all(), ]); } public function updateProduct(Product $product, Request $request) { // Memastikan hanya pemilik toko yang bisa mengupdate produk $this->authorize('manage products'); // Logika update produk $product->update($request->all()); return redirect()->back()->with('success', 'Produk berhasil diupdate!'); } } Pada contoh di atas: Pemilik toko diberikan akses ke seluruh produk dan laporan penjualan.authorize('manage products') digunakan untuk memastikan hanya pengguna dengan izin manage products yang dapat mengakses fitur tersebut.Terdapat juga fitur manageUsers untuk mengelola pengguna lain dan memberikan hak akses. 2. Kasir Toko Sebagai kasir, pengguna hanya memiliki akses untuk melakukan transaksi, melihat riwayat transaksi, dan mencetak struk. Mereka tidak bisa mengelola produk atau pengguna lain. Contoh kode untuk kasir: class CashierController extends Controller { public function __construct() { // Memastikan user memiliki role kasir $this->middleware(['role:kasir toko']); } public function processTransaction(Request $request) { // Memastikan user memiliki izin untuk memproses transaksi $this->authorize('manage transactions'); // Logika transaksi $transaction = new Transaction(); $transaction->customer_id = $request->customer_id; $transaction->total_amount = $request->total_amount; $transaction->save(); return redirect()->route('cashier.dashboard')->with('success', 'Transaksi berhasil diproses!'); } public function transactionHistory() { // Memastikan hanya kasir yang bisa melihat riwayat transaksi $this->authorize('view transactions'); $transactions = Transaction::where('cashier_id', auth()->user()->id)->get(); return view('cashier.transactions', compact('transactions')); } } Pada contoh di atas: Kasir hanya bisa mengakses halaman proses transaksi dan melihat riwayat transaksi mereka sendiri.Middleware role:kasir toko memastikan bahwa hanya kasir yang bisa mengakses controller ini. 3. Customer Sebagai customer, pengguna hanya memiliki akses untuk melihat produk dan melakukan pembelian. Mereka tidak bisa mengakses fitur-fitur administrasi seperti manajemen produk atau transaksi. Berikut contoh kode untuk customer: class ProductController extends Controller { public function index() { // Customer hanya bisa melihat produk yang tersedia return view('products.index', [ 'products' => Product::available()->get(), ]); } public function show(Product $product) { // Memastikan produk tersedia abort_if(!$product->isAvailable(), 404); return view('products.show', compact('product')); } public function addToCart(Product $product) { // Logika untuk menambahkan produk ke keranjang Cart::add($product); return redirect()->route('cart.index')->with('success', 'Produk berhasil ditambahkan ke keranjang'); } } Pada contoh di atas: Customer bisa melihat semua produk yang tersedia dengan Product::available().abort_if(!$product->isAvailable(), 404) memastikan bahwa customer hanya bisa melihat produk yang masih tersedia.Fungsi addToCart menambahkan produk ke keranjang belanja. 4. Penulis Artikel Sebagai penulis artikel, pengguna hanya memiliki akses untuk menulis dan mengelola artikel. Mereka tidak bisa melakukan transaksi atau mengelola produk. Berikut adalah contoh kode untuk penulis artikel: class ArticleController extends Controller { public function __construct() { // Memastikan user memiliki role penulis artikel $this->middleware(['role:penulis artikel']); } public function create() { // Memastikan user memiliki izin menulis artikel $this->authorize('write articles'); return view('articles.create'); } public function store(Request $request) { // Logika menyimpan artikel baru $article = new Article(); $article->title = $request->title; $article->content = $request->content; $article->author_id = auth()->user()->id; $article->save(); return redirect()->route('articles.index')->with('success', 'Artikel berhasil dipublikasikan!'); } public function edit(Article $article) { // Memastikan hanya penulis yang bisa mengedit artikel mereka sendiri $this->authorize('update', $article); return view('articles.edit', compact('article')); } public function update(Request $request, Article $article) { // Memastikan hanya penulis yang bisa mengupdate artikel mereka sendiri $this->authorize('update', $article); $article->update($request->all()); return redirect()->route('articles.index')->with('success', 'Artikel berhasil diupdate!'); } } Pada contoh di atas: Penulis artikel hanya bisa menulis, mengedit, dan menghapus artikel mereka sendiri.authorize('update', $article) memastikan bahwa penulis hanya bisa mengedit artikel yang mereka buat. Kesalahan Umum dalam Menerapkan RBAC di Laravel 11 (Dengan Contoh Koding) Ketika menerapkan RBAC (Role-Based Access Control) di Laravel 11, ada beberapa kesalahan umum yang sering terjadi. Memahami kesalahan ini dan menghindarinya dapat membantu memastikan bahwa aplikasi kamu aman dan efisien. 1. Tidak Memvalidasi Akses dengan Baik Salah satu kesalahan paling umum adalah tidak memvalidasi hak akses pengguna di setiap tindakan. Kadang-kadang, programmer hanya mengatur middleware di beberapa route, tetapi lupa untuk menambahkan validasi akses di dalam controller atau di method tertentu. Akibatnya, pengguna dapat mengakses fitur yang seharusnya dibatasi. Contoh Kesalahan: Misalkan kita memiliki controller di mana hanya admin yang boleh menghapus produk, tetapi kita lupa memvalidasi akses pengguna. class ProductController extends Controller { public function delete(Product $product) { // Kesalahan: Tidak ada validasi akses di sini $product->delete(); return redirect()->route('products.index')->with('success', 'Produk berhasil dihapus'); } } Dalam contoh di atas, siapa pun yang bisa mengakses method delete() dapat menghapus produk, bahkan jika mereka tidak memiliki hak akses. Solusi: Pastikan kamu menggunakan metode authorize atau middleware untuk memeriksa apakah pengguna memiliki izin yang tepat sebelum melakukan tindakan. class ProductController extends Controller { public function delete(Product $product) { // Solusi: Validasi hak akses pengguna $this->authorize('delete', $product); $product->delete(); return redirect()->route('products.index')->with('success', 'Produk berhasil dihapus'); } } Dengan menambahkan validasi akses menggunakan authorize, hanya pengguna yang memiliki hak akses yang bisa menghapus produk. 2. Menambahkan Terlalu Banyak Peran Kesalahan lain adalah membuat terlalu banyak peran yang sebenarnya tidak perlu. Misalnya, kamu mungkin tergoda untuk membuat peran khusus untuk setiap tindakan kecil dalam sistem. Hal ini dapat membuat manajemen hak akses menjadi rumit dan membingungkan. Contoh Kesalahan: Misalnya, kamu membuat peran terpisah untuk "editor produk", "penulis deskripsi produk", "pengelola gambar produk", dan sebagainya. Ini akan membuat sistem peran menjadi sangat kompleks dan sulit diatur. $role1 = Role::create(['name' => 'product editor']); $role2 = Role::create(['name' => 'product description writer']); $role3 = Role::create(['name' => 'product image manager']); Solusi: Sederhanakan peran pengguna dengan membuat peran yang lebih umum dan gunakan izin yang lebih spesifik. Misalnya, kamu bisa membuat peran "editor produk" yang memiliki beberapa izin terkait produk. $role = Role::create(['name' => 'product editor']); $role->givePermissionTo(['edit product', 'update product description', 'manage product images']); Dengan cara ini, manajemen peran dan hak akses menjadi lebih mudah dan terstruktur. 3. Mengandalkan Middleware Saja Tanpa Validasi di Controller Beberapa programmer menganggap bahwa dengan menambahkan middleware di route, mereka sudah melindungi aplikasi mereka sepenuhnya. Namun, middleware hanya berfungsi di level route dan tidak selalu mencakup semua skenario. Jika ada akses yang tidak diatur melalui route (misalnya melalui API atau form submission), pengguna mungkin masih bisa melakukan tindakan yang tidak diinginkan. Contoh Kesalahan: Mengandalkan middleware di route tanpa validasi tambahan di dalam method. // Di file routes/web.php Route::delete('/product/{id}', 'ProductController@delete')->middleware('role:admin'); Ini bagus, tetapi jika route diakses melalui jalur yang berbeda, tidak ada jaminan bahwa hanya admin yang bisa menghapus produk. Solusi: Selalu tambahkan validasi akses di dalam controller atau metode yang relevan, di samping middleware. class ProductController extends Controller { public function delete(Product $product) { // Validasi di controller, selain dari middleware $this->authorize('delete', $product); $product->delete(); return redirect()->route('products.index')->with('success', 'Produk berhasil dihapus'); } } 4. Tidak Menggunakan Cache untuk Hak Akses Saat aplikasi berkembang, memuat hak akses untuk setiap permintaan dari database bisa menjadi lambat. Menggunakan cache untuk menyimpan informasi hak akses adalah cara yang lebih efisien dan mempercepat performa aplikasi. Contoh Kesalahan: Setiap kali pengguna memuat halaman, Laravel mengecek hak akses pengguna langsung dari database tanpa menggunakan cache. $permissions = Permission::where('role', 'admin')->get(); Solusi: Kamu bisa menggunakan cache untuk menyimpan hak akses sementara, sehingga tidak perlu memuat ulang dari database setiap kali pengguna memuat halaman. $permissions = Cache::remember('permissions:admin', 60, function () { return Permission::where('role', 'admin')->get(); }); Dengan menggunakan cache, performa aplikasi akan meningkat karena data tidak perlu dimuat dari database berulang kali. Belajar Lebih Lanjut dengan Mentor Buildwithangga Jika kamu ingin belajar lebih dalam tentang penerapan RBAC dan fitur lain di Laravel 11, kamu bisa belajar dari mentor Buildwithangga. Berikut beberapa benefit yang bisa kamu dapatkan: Akses Seumur Hidup: Kamu akan mendapatkan akses penuh ke materi pembelajaran yang bisa diakses kapan saja.Bonus Konsultasi dengan Mentor: Kamu bisa berkonsultasi langsung dengan mentor untuk mendapatkan solusi dari permasalahan coding yang kamu hadapi.Grup Diskusi Antar Student: Kamu bisa berdiskusi dengan sesama student untuk saling berbagi pengetahuan dan pengalaman.Persiapan Kerja Lebih Matang: Dengan belajar di Buildwithangga, kamu akan mendapatkan persiapan kerja yang lebih baik, sehingga kamu bisa lebih siap menghadapi tantangan di dunia kerja. Kesimpulan Menerapkan RBAC pada website toko obat menggunakan Laravel 11 sangatlah mudah dengan bantuan package Spatie Role Permission. RBAC memungkinkan kita mengelola akses pengguna berdasarkan peran mereka, sehingga fitur-fitur yang ada tetap aman dan terorganisir dengan baik. Dengan pemahaman yang baik tentang RBAC, kamu bisa membangun aplikasi yang aman dan fungsional. Jangan ragu untuk belajar lebih lanjut dengan Buildwithangga dan manfaatkan berbagai keuntungan belajar yang tersedia.

Kelas 5 Kesalahan Umum dan Tips untuk UI/UX Designers Pemula! di BuildWithAngga

5 Kesalahan Umum dan Tips untuk UI/UX Designers Pemula!

User-Interface (UI) dan User-Experience (UX) design adalah elemen kunci dalam pembuatan produk digital yang sukses. Namun, bagi para UI/UX designer pemula, seringkali menemukan kesalahan umum yang dapat menghambat progress pekerjaan mereka. Dalam artikel ini, kita akan membahas lima kesalahan yang sering dilakukan oleh UI/UX Designer pemula besera tips-tipsnya! 1. Mengabaikan Riset Pengguna Salah satu kesalahan besar yang sering dilakukan oleh desainer UI/UX pemula adalah mengabaikan riset pengguna. Mereka mungkin terlalu fokus pada aspek estetika desain tanpa memahami kebutuhan dan preferensi pengguna. Kebanyakan mereka berpikir bahwa pekerjaan UI/UX hanya membuat desain yang menarik dan eye-catching. Tanpa riset yang baik, desainer bisa saja menghasilkan desain yang tidak sesuai dengan kebutuhan pengguna, sehingga mengurangi efektivitas produk digital tersebut. Di sinilah “empati” designer diuji. UI/UX designer harus memiliki empati yang tinggi agar kita bisa memberi pengaruh yang tepat dalam desain aplikasi/website ke pengguna. 2. Overdesign Seringkali, desainer pemula cenderung terlalu banyak membuat desain elemen-elemen antarmuka. Ini dapat mengakibatkan tampilan yang berlebihan dan membingungkan bagi pengguna. Terlalu banyak elemen dekoratif dan animasi yang tidak perlu dapat mengganggu fokus pengguna dan memperlambat kinerja aplikasi. Desain haruslah sederhana, intuitif, dan efisien. 3. Kurang Memahami Prinsip-prinsip UX Image by https://lawsofux.com/ “Tidak Memahami Prinsip-prinsip UX” Desainer UI/UX pemula sering tidak memahami prinsip-prinsip dasar UX design, seperti fokus desain harus sesuai kebutuhan pengguna, desain harus konsisten, desain mudah digunakan, dan memastikan hierarki desain yang tepat. Kekurangpahaman terhadap prinsip-prinsip ini dapat mengakibatkan desain yang tidak mudah digunakan dan membingungkan bagi user. Mempelajari prinsip-prinsip UX design adalah langkah kunci dalam menghindari kesalahan ini. 4. Tidak Mendengarkan feedback Kesalahan lain yang sering dilakukan oleh desainer UI/UX pemula adalah tidak mendengarkan umpan balik pengguna. Feedback dari pengguna/user sangat penting untuk meningkatkan pengalaman pengguna dan mengidentifikasi masalah dalam desain. Mengabaikan feedback dapat mengakibatkan kesalahan yang tidak terdeteksi dan merugikan produktivitas. 5. Tidak Menguji Desain Terakhir, banyak UI/UX designer pemula gagal melakukan pengujian desain. Hal ini adalah tahap kunci dalam mengidentifikasi masalah dan memastikan bahwa desain berfungsi sesuai yang diharapkan. Tanpa tahap pengujian, kesalahan dapat terlewatkan dan mengakibatkan produk digital yang kita buat jadi kurang efektif. Ketika ingin menjadi UI/UX designer yang lebih baik, penting untuk menghindari kesalahan-kesalahan tersebut. Terlibatlah dalam riset pengguna, terapkan prinsip-prinsip UX design, memahami dan mendengarkan feedback pengguna, dan uji desain Anda secara teratur. Dengan begitu, Anda dapat impove kualitas desain Anda dan menampilkan pengalaman pengguna yang lebih baik m produk digital yang Anda buat. Kesimpulan 💬 Sebagai seorang UI/UX designer pemula, kesalahan adalah hal yang wajar dalam proses pembelajaran. Namun, dengan menyadari kesalahan-kesalahan umum ini dan berusaha untuk menghindarinya, kamu dapat mengembangkan keterampilan desain kamu dengan lebih cepat dan menciptakan produk yang lebih baik. “Design” adalah seni yang terus berkembang, dan selalu ada ruang untuk belajar dan meningkatkan diri 😊 Berikut beberapa tips untuk UI/UX pemula 💯: 1. Lack of Emphaty to User? Melakukan Penelitian Pengguna: Lakukan penelitian berupa wawancara, survey, dan observasi terhadap pengguna yang sesungguhnya. Pahami kebutuhan, masalah, dan preferensi mereka. Buat Persona Pengguna: Kita bisa juga membuat profil pengguna yang mencerminkan karakteristik utama audiens kamu, sehingga Anda dapat merujuknya selama proses desain. 2. Bagi Anda yang merasa terlalu banyak informasi dalam UI-mu: Prioritaskan Informasi: Identifikasi informasi utama yang harus diberikan kepada pengguna dan tampilkan dengan jelas. Informasi tambahan bisat ditempatkan pada halaman atau layar yang berbeda. Hierarki Visual: Gunakan elemen desain seperti ukuran, warna, dan tata letak untuk menyoroti informasi yang paling penting dan menarik perhatian pengguna. 3. Tidak menerapkan/memahami prinsip-prinsip UX? Perbanyak Belajar Prinsip-prinsip Desain: Pahami prinsip-prinsip dasar seperti konsistensi, kesederhanaan, dan fokus pada pengguna. Rajin Pantau Perkembangan Desain: Selalu ikuti tren dan perkembangan terbaru dalam desain UI/UX untuk tetap relevan dan up-to-date. 4. Dengarkan dan pahami feedback! Bekerja dalam Tim: Kerja sama dengan rekan-rekan tim dan pengguna untuk mengumpulkan perspektif dan feedback yang berbeda dan memperkaya desain Anda. Terbuka terhadap Feedback: Terima feedback dengan pikiran terbuka, dan jadikan hal tersebut sebagai kesempatan untuk memperbaiki desainmu. 5. Jangan lupa menguji desain apakah sudah responsive dan mudah diakses atau belum Pastikan desain Anda responsif, sehingga dapat menyesuaikan dengan berbagai ukuran layar dan perangkat (Mobile/Web design). Perhatikan aksesibilitas dengan memastikan bahwa produk Anda dapat diakses oleh semua orang, termasuk mereka yang memiliki disabilitas. Ikuti pedoman/arahan aksesibilitas web seperti WCAG (Web Content Accessibility Guidelines). Jadi gimana? Sudah tahu kan apa yang harus dilakukan dan apa yang harus dihindari sebagai UI/UX designer pemula? Yuk ikut kelas UI/UX Design untuk belajar lebih dalam tentang UI/UX supaya kamu terhindar dari kesalahan-kesalahan di atas dan bangun portofolio berkualitas! Semoga bermanfaat ya! 😊