Akses kelas selamanya

Ambil Promo
flash sale
hamburger-menu

Tips Backend Development

Meningkatkan skills menjadi 1% lebih baik

Reset
Kelas Tutorial Laravel 11, Midtrans, Filament: Bikin Web Booking Event Ticket di BuildWithAngga

Tutorial Laravel 11, Midtrans, Filament: Bikin Web Booking Event Ticket

Jika kamu seorang developer yang sedang belajar Laravel, kamu pasti tahu betapa pentingnya memiliki halaman admin yang terstruktur. Kali ini, kita akan membahas bagaimana membangun halaman admin lengkap dengan content management system (CMS) untuk sebuah projek website booking event ticket. Dalam tutorial ini, kita akan menggunakan Laravel sebagai framework utama dan Filament sebagai alat untuk mempercepat pembuatan interface admin. Mengapa Halaman Admin Penting dalam Web Development? Halaman admin adalah jantung dari setiap aplikasi berbasis web yang membutuhkan pengelolaan data. Tanpa halaman admin yang baik, pengelolaan produk, pesanan, pelanggan, dan laporan penjualan akan terasa sulit dan memakan waktu. Dengan halaman admin yang terstruktur, semua aktivitas ini dapat dilakukan dengan lebih efisien dan terorganisir. Dalam konteks web development untuk booking event ticket, halaman admin memungkinkan developer atau pengelola aplikasi untuk: Mengelola produk atau event: Menambahkan, mengedit, atau menghapus event yang akan dijual tiketnya.Memantau pesanan: Memantau status pesanan, seperti tiket yang sudah terjual, tiket yang masih tersedia, dan pembayaran yang sukses.Mengelola pelanggan: Melihat data pelanggan, seperti nama, email, atau riwayat pembelian mereka.Membuat laporan penjualan: Melihat performa penjualan dalam periode tertentu untuk analisis bisnis yang lebih baik. Laravel dan Filament: Kombinasi untuk Admin Panel Modern Laravel adalah salah satu framework PHP yang paling populer untuk web development. Framework ini menawarkan struktur yang rapi, fitur lengkap, dan dukungan komunitas yang besar. Sementara itu, Filament adalah library yang mempermudah developer dalam membuat admin panel modern dengan UI yang interaktif. Dengan Filament, kita bisa membuat halaman admin yang responsif dan fungsional tanpa harus memulai semuanya dari awal. Library ini menawarkan fitur bawaan seperti manajemen data, integrasi dengan berbagai database, hingga kemampuan untuk menyesuaikan tampilan sesuai kebutuhan projekmu. Pentingnya Integrasi Midtrans untuk Proses Pembayaran Salah satu aspek penting dalam aplikasi booking event ticket adalah proses pembayaran. Di sini, kita akan menggunakan Midtrans sebagai payment gateway. Midtrans mempermudah developer untuk mengintegrasikan berbagai metode pembayaran seperti kartu kredit, transfer bank, dan dompet digital ke dalam aplikasi Laravel. Dengan menggunakan Midtrans, kamu bisa: Menyediakan banyak pilihan metode pembayaran untuk pelanggan.Memastikan transaksi berjalan dengan aman dan terenkripsi.Mempermudah proses rekonsiliasi pembayaran dengan laporan otomatis. Integrasi Midtrans di halaman admin juga memungkinkan pengelola untuk melihat status pembayaran secara real-time, mengurangi risiko kesalahan atau fraud. Struktur Halaman Admin yang Ideal Untuk memaksimalkan pengalaman pengguna di halaman admin, penting untuk merancang struktur yang intuitif dan efisien. Berikut adalah beberapa elemen utama yang sebaiknya ada di halaman admin CMS untuk aplikasi booking event ticket: Dashboard Berisi ringkasan data seperti jumlah event yang tersedia, tiket yang terjual, dan total pendapatan.Manajemen Produk Fitur untuk menambah, mengedit, dan menghapus event yang akan dijual tiketnya.Manajemen Pesanan Menampilkan daftar pesanan beserta status pembayaran, jumlah tiket, dan informasi pelanggan.Manajemen Pelanggan Berisi data pelanggan, riwayat pembelian, dan preferensi mereka.Laporan Penjualan Grafik dan tabel yang menunjukkan performa penjualan, pendapatan, dan data lain untuk analisis bisnis. Dengan struktur ini, halaman admin dapat menjadi alat yang kuat untuk mempermudah pengelolaan aplikasi booking event ticket. Cara Membuat Projek Laravel Terbaru dan Mengatur Koneksi MySQL Laravel adalah salah satu framework PHP yang populer dan sangat cocok untuk membangun aplikasi berbasis web. Berikut adalah panduan lengkap untuk membuat projek Laravel terbaru menggunakan Composer dan mengatur file .env untuk koneksi ke MySQL. 1. Membuat Projek Laravel Baru Langkah pertama adalah menggunakan perintah Composer untuk membuat projek Laravel terbaru. Pastikan kamu sudah menginstal Composer di komputermu. Jalankan perintah berikut di terminal atau command prompt: composer create-project --prefer-dist laravel/laravel nama-projek Ganti nama-projek dengan nama yang ingin kamu gunakan untuk projek Laravel-mu. Perintah ini akan mengunduh semua file yang diperlukan dan mengatur struktur awal projek. 2. Masuk ke Direktori Projek Setelah proses instalasi selesai, masuk ke direktori projek yang telah dibuat: cd nama-projek 3. Konfigurasi Koneksi Database di File .env Setelah projek dibuat, langkah selanjutnya adalah mengatur koneksi database. Laravel menggunakan file .env untuk menyimpan konfigurasi lingkungan, termasuk detail koneksi database. Buka file .env yang ada di direktori root projekmu, lalu cari bagian yang berkaitan dengan database. Berikut adalah contoh konfigurasi default yang perlu kamu sesuaikan: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=root DB_PASSWORD=password_database Berikut penjelasan masing-masing parameter: DB_CONNECTION: Jenis database yang digunakan, dalam hal ini mysql.DB_HOST: Alamat host database. Biasanya 127.0.0.1 untuk server lokal.DB_PORT: Port yang digunakan oleh MySQL, default-nya adalah 3306.DB_DATABASE: Nama database yang akan digunakan untuk projek ini.DB_USERNAME: Username untuk koneksi database. Biasanya root untuk server lokal.DB_PASSWORD: Password untuk user database. Contoh file .env yang sudah disesuaikan: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=booking_event DB_USERNAME=root DB_PASSWORD= Catatan: Ganti DB_DATABASE, DB_USERNAME, dan DB_PASSWORD sesuai dengan pengaturan database di servermu. 4. Membuat Database di MySQL Pastikan kamu telah membuat database sesuai dengan nama yang diatur di file .env. Kamu bisa membuat database menggunakan command line atau tools seperti phpMyAdmin. Jika menggunakan command line, jalankan perintah berikut: CREATE DATABASE booking_event; Ganti booking_event dengan nama database yang kamu gunakan. 5. Menguji Koneksi Database Untuk memastikan bahwa konfigurasi database berhasil, jalankan perintah migrasi default Laravel. Perintah ini akan membuat tabel bawaan Laravel di database: php artisan migrate Jika tidak ada error yang muncul, berarti koneksi ke database sudah berhasil diatur. Contoh File .env Lengkap Berikut adalah contoh file .env yang sudah diatur untuk koneksi MySQL: APP_NAME=Laravel APP_ENV=local APP_KEY=base64:xz13abcDEFghi5678jklMNOpqrstuvWXyz9= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=booking_event DB_USERNAME=root DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=file FILESYSTEM_DRIVER=local QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="[email protected]" MAIL_FROM_NAME="${APP_NAME}" Setelah semua langkah ini selesai, projek Laravel-mu sudah siap terhubung dengan database MySQL, dan kamu dapat melanjutkan pengembangan aplikasi sesuai kebutuhan! Membuat Migration, Model, dan Relasi untuk Tabel di Projek Booking Event Ticket Pada aplikasi booking event ticket, tabel utama seperti products, categories, customers, dan orders membutuhkan struktur database yang terintegrasi dengan baik. Berikut adalah langkah-langkah untuk membuat file migration, model, properti fillable, dan hubungan antar tabel menggunakan Laravel Eloquent. Membuat Migration untuk Tabel Gunakan Artisan command untuk membuat migration. Setiap tabel dibuat dengan perintah: php artisan make:migration create_products_table php artisan make:migration create_categories_table php artisan make:migration create_customers_table php artisan make:migration create_orders_table Setelah perintah ini dijalankan, file migration akan dibuat di direktori database/migrations. Edit file-file tersebut untuk mendefinisikan struktur tabel. Migration untuk Tabel products use Illuminate\\Database\\Migrations\\Migration; use Illuminate\\Database\\Schema\\Blueprint; use Illuminate\\Support\\Facades\\Schema; class CreateProductsTable extends Migration { public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->text('description')->nullable(); $table->decimal('price', 10, 2); $table->unsignedBigInteger('category_id'); $table->timestamps(); $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); }); } public function down() { Schema::dropIfExists('products'); } } Migration untuk Tabel categories 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 customers class CreateCustomersTable extends Migration { public function up() { Schema::create('customers', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->string('phone'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('customers'); } } Migration untuk Tabel orders class CreateOrdersTable extends Migration { public function up() { Schema::create('orders', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('customer_id'); $table->decimal('total_price', 10, 2); $table->timestamps(); $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade'); }); } public function down() { Schema::dropIfExists('orders'); } } Jalankan semua migration dengan perintah: php artisan migrate Membuat Model untuk Setiap Tabel Gunakan Artisan command untuk membuat model: php artisan make:model Product php artisan make:model Category php artisan make:model Customer php artisan make:model Order Edit masing-masing model untuk menambahkan properti fillable dan mendefinisikan relasi antar tabel. Model Product namespace App\\Models; use Illuminate\\Database\\Eloquent\\Factories\\HasFactory; use Illuminate\\Database\\Eloquent\\Model; class Product extends Model { use HasFactory; protected $fillable = ['name', 'description', 'price', 'category_id']; public function category() { return $this->belongsTo(Category::class); } } 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 products() { return $this->hasMany(Product::class); } } Model Customer namespace App\\Models; use Illuminate\\Database\\Eloquent\\Factories\\HasFactory; use Illuminate\\Database\\Eloquent\\Model; class Customer extends Model { use HasFactory; protected $fillable = ['name', 'email', 'phone']; public function orders() { return $this->hasMany(Order::class); } } Model Order namespace App\\Models; use Illuminate\\Database\\Eloquent\\Factories\\HasFactory; use Illuminate\\Database\\Eloquent\\Model; class Order extends Model { use HasFactory; protected $fillable = ['customer_id', 'total_price']; public function customer() { return $this->belongsTo(Customer::class); } public function products() { return $this->belongsToMany(Product::class, 'order_product')->withPivot('quantity'); } } Menambahkan Pivot Table untuk Order dan Product Gunakan perintah berikut untuk membuat pivot table order_product: php artisan make:migration create_order_product_table Edit migration tersebut: use Illuminate\\Database\\Migrations\\Migration; use Illuminate\\Database\\Schema\\Blueprint; use Illuminate\\Support\\Facades\\Schema; class CreateOrderProductTable extends Migration { public function up() { Schema::create('order_product', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('order_id'); $table->unsignedBigInteger('product_id'); $table->integer('quantity'); $table->timestamps(); $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade'); $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); }); } public function down() { Schema::dropIfExists('order_product'); } } Jalankan kembali perintah migrate untuk membuat tabel ini: php artisan migrate Dengan langkah-langkah ini, struktur tabel, model, properti fillable, dan hubungan antar tabel telah selesai dibuat. Kini projek Laravel untuk aplikasi booking event ticket siap dikembangkan lebih lanjut. Cara Menginstall Package Filament dan Membuat Akun Admin di Laravel Filament adalah library admin panel yang memudahkan developer membangun antarmuka admin yang modern dan fungsional. Berikut adalah panduan lengkap untuk menginstal Filament, membuat akun admin, dan mengonfigurasinya agar pengguna dapat bertindak sebagai admin. Menginstal Package Filament Langkah pertama adalah menginstal Filament pada projek Laravel. Pastikan Laravel sudah terinstal dan berfungsi dengan baik. Jalankan perintah berikut di terminal: composer require filament/filament Perintah ini akan mengunduh dan menginstal semua dependensi yang diperlukan untuk menggunakan Filament. Menjalankan Instalasi Filament Setelah package berhasil diinstal, jalankan perintah berikut untuk menyelesaikan instalasi Filament: php artisan filament:install Perintah ini akan menyiapkan semua file dan konfigurasi dasar yang dibutuhkan oleh Filament. Membuat Akun Admin Untuk membuat akun admin yang dapat mengakses panel admin Filament, gunakan command berikut: php artisan make:filament-user Setelah perintah ini dijalankan, kamu akan diminta untuk mengisi informasi pengguna admin, seperti berikut: Nama pengguna: Masukkan nama pengguna admin.Email pengguna: Masukkan email pengguna admin.Password: Masukkan password untuk admin. Setelah selesai, user ini secara otomatis akan ditambahkan ke database dan siap digunakan untuk login ke panel admin. Mengonfigurasi User sebagai Admin Filament secara default menggunakan model App\\Models\\User untuk autentikasi. Model ini harus memiliki peran atau akses yang sesuai agar pengguna dapat bertindak sebagai admin. Menambahkan Middleware Autentikasi Pastikan middleware autentikasi sudah diatur di file filament.php yang terletak di direktori config. Buka file tersebut, dan pastikan bagian auth diatur seperti ini: 'auth' => [ 'guard' => 'web', // Gunakan guard default 'pages' => [ 'login' => \\Filament\\Http\\Livewire\\Auth\\Login::class, ], ], Menjalankan Panel Admin Setelah semua langkah di atas selesai, jalankan server Laravel: php artisan serve Akses panel admin Filament dengan membuka URL berikut di browser: <http://localhost/admin> Masukkan email dan password yang sudah dibuat dengan php artisan make:filament-user. Setelah login, kamu akan melihat dashboard admin Filament. Membuat Resource CRUD untuk Tabel di Filament Filament menyediakan cara cepat untuk membuat fitur CRUD menggunakan perintah Artisan. Kita akan membuat resource untuk tabel products, categories, customers, dan orders. Berikut adalah langkah-langkah lengkap beserta contoh kodingnya. Membuat Resource dengan Artisan Command Gunakan perintah berikut untuk membuat resource CRUD untuk masing-masing tabel: php artisan make:filament-resource Product php artisan make:filament-resource Category php artisan make:filament-resource Customer php artisan make:filament-resource Order Perintah ini akan membuat file resource di direktori App\\Filament\\Resources. File ini berisi konfigurasi untuk halaman CRUD, termasuk fields, forms, dan tables. Resource untuk Product Mengatur ProductResource Buka file ProductResource.php di App\\Filament\\Resources dan atur fields, forms, dan tables. namespace App\\Filament\\Resources; use App\\Filament\\Resources\\ProductResource\\Pages; use App\\Models\\Product; use Filament\\Forms; use Filament\\Tables; use Filament\\Resources\\Resource; use Filament\\Resources\\Forms\\Components\\TextInput; use Filament\\Resources\\Forms\\Components\\Textarea; use Filament\\Resources\\Forms\\Components\\Select; use Filament\\Resources\\Tables\\Columns\\TextColumn; class ProductResource extends Resource { protected static ?string $model = Product::class; protected static ?string $navigationIcon = 'heroicon-o-collection'; public static function form(Forms\\Form $form): Forms\\Form { return $form->schema([ TextInput::make('name')->required(), Textarea::make('description'), TextInput::make('price')->numeric()->required(), Select::make('category_id') ->relationship('category', 'name') ->required(), ]); } public static function table(Tables\\Table $table): Tables\\Table { return $table->columns([ TextColumn::make('id')->sortable(), TextColumn::make('name')->sortable()->searchable(), TextColumn::make('price')->sortable(), TextColumn::make('category.name')->label('Category'), ]); } public static function getPages(): array { return [ 'index' => Pages\\ListProducts::route('/'), 'create' => Pages\\CreateProduct::route('/create'), 'edit' => Pages\\EditProduct::route('/{record}/edit'), ]; } } Fields dan Tables: Fields:name: Input teks wajib diisi.description: Textarea opsional.price: Input numerik wajib diisi.category_id: Dropdown untuk memilih kategori.Table Columns:id: Ditampilkan dan dapat diurutkan.name: Dapat dicari dan diurutkan.price: Dapat diurutkan.category.name: Menampilkan nama kategori terkait. Resource untuk Category Mengatur CategoryResource namespace App\\Filament\\Resources; use App\\Filament\\Resources\\CategoryResource\\Pages; use App\\Models\\Category; use Filament\\Forms; use Filament\\Tables; use Filament\\Resources\\Resource; use Filament\\Resources\\Forms\\Components\\TextInput; use Filament\\Resources\\Tables\\Columns\\TextColumn; class CategoryResource extends Resource { protected static ?string $model = Category::class; protected static ?string $navigationIcon = 'heroicon-o-folder'; public static function form(Forms\\Form $form): Forms\\Form { return $form->schema([ TextInput::make('name')->required(), ]); } public static function table(Tables\\Table $table): Tables\\Table { return $table->columns([ TextColumn::make('id')->sortable(), TextColumn::make('name')->sortable()->searchable(), ]); } public static function getPages(): array { return [ 'index' => Pages\\ListCategories::route('/'), 'create' => Pages\\CreateCategory::route('/create'), 'edit' => Pages\\EditCategory::route('/{record}/edit'), ]; } } Fields dan Tables: Fields:name: Input teks wajib diisi.Table Columns:id: Ditampilkan dan dapat diurutkan.name: Dapat dicari dan diurutkan. Resource untuk Customer Mengatur CustomerResource namespace App\\Filament\\Resources; use App\\Filament\\Resources\\CustomerResource\\Pages; use App\\Models\\Customer; use Filament\\Forms; use Filament\\Tables; use Filament\\Resources\\Resource; use Filament\\Resources\\Forms\\Components\\TextInput; use Filament\\Resources\\Tables\\Columns\\TextColumn; class CustomerResource extends Resource { protected static ?string $model = Customer::class; protected static ?string $navigationIcon = 'heroicon-o-user'; public static function form(Forms\\Form $form): Forms\\Form { return $form->schema([ TextInput::make('name')->required(), TextInput::make('email')->email()->required(), TextInput::make('phone')->required(), ]); } public static function table(Tables\\Table $table): Tables\\Table { return $table->columns([ TextColumn::make('id')->sortable(), TextColumn::make('name')->sortable()->searchable(), TextColumn::make('email')->searchable(), TextColumn::make('phone'), ]); } public static function getPages(): array { return [ 'index' => Pages\\ListCustomers::route('/'), 'create' => Pages\\CreateCustomer::route('/create'), 'edit' => Pages\\EditCustomer::route('/{record}/edit'), ]; } } Fields dan Tables: Fields:name: Input teks wajib diisi.email: Input email wajib diisi.phone: Input teks wajib diisi.Table Columns:id: Ditampilkan dan dapat diurutkan.name: Dapat dicari dan diurutkan.email: Dapat dicari.phone: Ditampilkan. Resource untuk Order Mengatur OrderResource namespace App\\Filament\\Resources; use App\\Filament\\Resources\\OrderResource\\Pages; use App\\Models\\Order; use Filament\\Forms; use Filament\\Tables; use Filament\\Resources\\Resource; use Filament\\Resources\\Forms\\Components\\TextInput; use Filament\\Resources\\Forms\\Components\\Select; use Filament\\Resources\\Tables\\Columns\\TextColumn; class OrderResource extends Resource { protected static ?string $model = Order::class; protected static ?string $navigationIcon = 'heroicon-o-shopping-cart'; public static function form(Forms\\Form $form): Forms\\Form { return $form->schema([ Select::make('customer_id') ->relationship('customer', 'name') ->required(), TextInput::make('total_price')->numeric()->required(), ]); } public static function table(Tables\\Table $table): Tables\\Table { return $table->columns([ TextColumn::make('id')->sortable(), TextColumn::make('customer.name')->label('Customer')->searchable(), TextColumn::make('total_price')->sortable(), TextColumn::make('created_at')->label('Order Date')->dateTime(), ]); } public static function getPages(): array { return [ 'index' => Pages\\ListOrders::route('/'), 'create' => Pages\\CreateOrder::route('/create'), 'edit' => Pages\\EditOrder::route('/{record}/edit'), ]; } } Fields dan Tables: Fields:customer_id: Dropdown untuk memilih pelanggan.total_price: Input numerik wajib diisi.Table Columns:id: Ditampilkan dan dapat diurutkan.customer.name: Menampilkan nama pelanggan.total_price: Dapat diurutkan.created_at: Ditampilkan sebagai tanggal. Dengan konfigurasi di atas, setiap resource kini memiliki fitur CRUD yang lengkap dan dapat diakses melalui admin panel Filament. Menambahkan Fitur Integrasi dengan Payment Gateway (Midtrans) Mengintegrasikan payment gateway seperti Midtrans ke aplikasi Laravel memungkinkan kita memproses pembayaran langsung dari halaman checkout dan memonitor transaksi melalui halaman admin. Berikut adalah langkah-langkah lengkap untuk mengintegrasikan Midtrans ke dalam aplikasi Laravel, termasuk pengelolaan pembayaran di halaman admin. Instalasi dan Konfigurasi Midtrans Untuk mengintegrasikan Midtrans, pastikan Anda memiliki akun di Midtrans dan mendapatkan API key. Berikut langkah-langkahnya: 1. Instalasi Library Midtrans Tambahkan library Midtrans SDK ke dalam projek Laravel dengan menggunakan Composer: composer require midtrans/midtrans-php 2. Konfigurasi API Key Tambahkan API key Midtrans ke dalam file .env: MIDTRANS_SERVER_KEY=your-server-key MIDTRANS_CLIENT_KEY=your-client-key MIDTRANS_IS_PRODUCTION=false MIDTRANS_MERCHANT_ID=your-merchant-id Buat file konfigurasi baru untuk Midtrans. Jalankan perintah: php artisan make:config midtrans Edit file config/midtrans.php: return [ 'serverKey' => env('MIDTRANS_SERVER_KEY'), 'clientKey' => env('MIDTRANS_CLIENT_KEY'), 'isProduction' => env('MIDTRANS_IS_PRODUCTION', false), 'merchantId' => env('MIDTRANS_MERCHANT_ID'), ]; Membuat Proses Checkout dengan Midtrans Membuat Form Checkout Di halaman checkout, tampilkan form untuk memasukkan detail pembelian. Contoh form: <form action="/checkout/process" method="POST"> @csrf <label for="name">Nama:</label> <input type="text" name="name" id="name" required> <label for="email">Email:</label> <input type="email" name="email" id="email" required> <label for="amount">Jumlah Pembayaran:</label> <input type="number" name="amount" id="amount" required> <button type="submit">Bayar Sekarang</button> </form> Membuat Controller untuk Proses Pembayaran Buat controller untuk memproses pembayaran dengan Midtrans: php artisan make:controller CheckoutController Edit CheckoutController: namespace App\\Http\\Controllers; use Illuminate\\Http\\Request; use Midtrans\\Config; use Midtrans\\Snap; class CheckoutController extends Controller { public function process(Request $request) { // Konfigurasi Midtrans Config::$serverKey = config('midtrans.serverKey'); Config::$isProduction = config('midtrans.isProduction'); Config::$isSanitized = true; Config::$is3ds = true; // Data transaksi $transactionDetails = [ 'order_id' => uniqid(), 'gross_amount' => $request->amount, ]; $customerDetails = [ 'first_name' => $request->name, 'email' => $request->email, ]; $transaction = [ 'transaction_details' => $transactionDetails, 'customer_details' => $customerDetails, ]; // Mendapatkan token transaksi $snapToken = Snap::getSnapToken($transaction); // Mengirimkan token ke view untuk ditampilkan return view('checkout.payment', ['snapToken' => $snapToken]); } } Menampilkan Snap Midtrans di View Buat file resources/views/checkout/payment.blade.php: <!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="<https://app.sandbox.midtrans.com/snap/snap.js>" data-client-key="{{ config('midtrans.clientKey') }}"></script> </head> <body> <button id="pay-button">Bayar Sekarang</button> <script type="text/javascript"> var payButton = document.getElementById('pay-button'); payButton.addEventListener('click', function () { snap.pay('{{ $snapToken }}', { onSuccess: function (result) { alert('Payment Success'); console.log(result); }, onPending: function (result) { alert('Payment Pending'); console.log(result); }, onError: function (result) { alert('Payment Failed'); console.log(result); }, }); }); </script> </body> </html> Mengelola Pembayaran di Halaman Admin Tambahkan tabel transactions untuk mencatat pembayaran. Buat migrasi baru: php artisan make:migration create_transactions_table Edit file migrasi: 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->string('order_id')->unique(); $table->decimal('gross_amount', 10, 2); $table->string('payment_status'); $table->string('customer_name'); $table->string('customer_email'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('transactions'); } } Jalankan migrasi: php artisan migrate Tambahkan model dan resource CRUD untuk transaksi menggunakan Filament: php artisan make:model Transaction -m php artisan make:filament-resource Transaction Edit TransactionResource untuk menampilkan data pembayaran di admin panel: namespace App\\Filament\\Resources; use App\\Filament\\Resources\\TransactionResource\\Pages; use App\\Models\\Transaction; use Filament\\Resources\\Resource; use Filament\\Resources\\Forms; use Filament\\Resources\\Tables; use Filament\\Resources\\Forms\\Components\\TextInput; use Filament\\Resources\\Tables\\Columns\\TextColumn; class TransactionResource extends Resource { protected static ?string $model = Transaction::class; public static function form(Forms\\Form $form): Forms\\Form { return $form->schema([ TextInput::make('order_id')->disabled(), TextInput::make('customer_name')->disabled(), TextInput::make('customer_email')->disabled(), TextInput::make('gross_amount')->disabled(), TextInput::make('payment_status')->disabled(), ]); } public static function table(Tables\\Table $table): Tables\\Table { return $table->columns([ TextColumn::make('order_id'), TextColumn::make('customer_name'), TextColumn::make('gross_amount'), TextColumn::make('payment_status'), TextColumn::make('created_at')->label('Transaction Date')->dateTime(), ]); } public static function getPages(): array { return [ 'index' => Pages\\ListTransactions::route('/'), 'view' => Pages\\ViewTransaction::route('/{record}'), ]; } } Dengan konfigurasi ini, pembayaran dapat diproses melalui halaman checkout menggunakan Midtrans, dan semua data transaksi dapat dikelola melalui halaman admin. Menambahkan Fitur Notifikasi Email Otomatis di Laravel Laravel menyediakan fitur untuk mengirim notifikasi email menggunakan class Mailable. Fitur ini sangat berguna untuk menginformasikan pengguna ketika ada pesanan baru, perubahan status pesanan, atau pengingat untuk menyelesaikan pembayaran. Berikut adalah langkah-langkah untuk menambahkan notifikasi email otomatis dengan contoh koding lengkap. Konfigurasi Email di Laravel Pastikan konfigurasi email sudah diatur di file .env. Misalnya, menggunakan SMTP: MAIL_MAILER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=your_username MAIL_PASSWORD=your_password MAIL_ENCRYPTION=tls [email protected] MAIL_FROM_NAME="Your Application" Membuat Class Mailable Gunakan perintah Artisan untuk membuat class Mailable yang akan digunakan sebagai template email: php artisan make:mail OrderNotification File OrderNotification.php akan dibuat di direktori App\\Mail. Edit file ini untuk mengatur konten email: namespace App\\Mail; use Illuminate\\Bus\\Queueable; use Illuminate\\Mail\\Mailable; use Illuminate\\Queue\\SerializesModels; class OrderNotification extends Mailable { use Queueable, SerializesModels; public $order; public $message; public function __construct($order, $message) { $this->order = $order; $this->message = $message; } public function build() { return $this->subject('Order Notification') ->view('emails.order-notification') ->with([ 'order' => $this->order, 'message' => $this->message, ]); } } Membuat Template Email Buat file template email di resources/views/emails/order-notification.blade.php: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Order Notification</title> </head> <body> <h1>Hi {{ $order->customer_name }},</h1> <p>{{ $message }}</p> <h3>Order Details:</h3> <ul> <li>Order ID: {{ $order->id }}</li> <li>Total: {{ $order->total_price }}</li> <li>Status: {{ $order->status }}</li> </ul> <p>Thank you for shopping with us!</p> </body> </html> Mengirim Email Berdasarkan Event Buat event dan listener untuk mengirim email ketika ada pesanan baru atau perubahan status pesanan. Membuat Event dan Listener Gunakan perintah untuk membuat event OrderStatusUpdated: php artisan make:event OrderStatusUpdated Edit file event OrderStatusUpdated.php: namespace App\\Events; use App\\Models\\Order; use Illuminate\\Foundation\\Events\\Dispatchable; use Illuminate\\Queue\\SerializesModels; class OrderStatusUpdated { use Dispatchable, SerializesModels; public $order; public $message; public function __construct(Order $order, $message) { $this->order = $order; $this->message = $message; } } Buat listener untuk event ini: php artisan make:listener SendOrderNotification Edit file listener SendOrderNotification.php: namespace App\\Listeners; use App\\Events\\OrderStatusUpdated; use App\\Mail\\OrderNotification; use Illuminate\\Support\\Facades\\Mail; class SendOrderNotification { public function handle(OrderStatusUpdated $event) { Mail::to($event->order->customer_email)->send( new OrderNotification($event->order, $event->message) ); } } Mendaftarkan Event dan Listener Daftarkan event dan listener di EventServiceProvider.php: protected $listen = [ \\App\\Events\\OrderStatusUpdated::class => [ \\App\\Listeners\\SendOrderNotification::class, ], ]; Menggunakan Event untuk Mengirim Email Trigger event ketika status pesanan berubah. Misalnya, di controller yang mengelola pesanan: namespace App\\Http\\Controllers; use App\\Events\\OrderStatusUpdated; use App\\Models\\Order; use Illuminate\\Http\\Request; class OrderController extends Controller { public function updateStatus(Request $request, $id) { $order = Order::findOrFail($id); $order->status = $request->status; $order->save(); $message = "Your order status has been updated to: {$order->status}."; // Trigger event event(new OrderStatusUpdated($order, $message)); return response()->json(['message' => 'Order status updated and notification sent.']); } } Menambahkan Pengingat untuk Menyelesaikan Pembayaran Untuk mengirim pengingat otomatis, gunakan job dengan queue: Buat job menggunakan perintah: php artisan make:job SendPaymentReminder Edit file job SendPaymentReminder.php: namespace App\\Jobs; use App\\Mail\\OrderNotification; use App\\Models\\Order; use Illuminate\\Bus\\Queueable; use Illuminate\\Support\\Facades\\Mail; class SendPaymentReminder { use Queueable; protected $order; public function __construct(Order $order) { $this->order = $order; } public function handle() { $message = "Please complete your payment for order #{$this->order->id}."; Mail::to($this->order->customer_email)->send( new OrderNotification($this->order, $message) ); } } Tambahkan logika untuk dispatch job, misalnya di scheduler (app/Console/Kernel.php): protected function schedule(Schedule $schedule) { $schedule->call(function () { $orders = Order::where('status', 'pending')->get(); foreach ($orders as $order) { dispatch(new SendPaymentReminder($order)); } })->daily(); } Dengan demikian, kita telah berhasil membangun sebuah dashboard canggih yang terintegrasi dengan Midtrans untuk pembayaran, serta dukungan notifikasi otomatis melalui email provider. Fitur-fitur ini menjadikan aplikasi kita lebih profesional, fungsional, dan siap untuk digunakan di dunia nyata. Namun, kemampuan seperti ini membutuhkan waktu untuk dikuasai, terutama jika ingin membangun sistem yang scalable dan efisien. Sebagai programmer, terus belajar adalah kunci untuk tetap relevan dan berkembang. Bergabunglah dengan program mentoring bersama BuildWithAngga, di mana Anda bisa belajar langsung dari mentor expert yang siap membimbing Anda. Keuntungan belajar di BuildWithAngga: Akses materi seumur hidup, memungkinkan Anda untuk belajar kapan saja.Portfolio berkualitas tinggi, yang dirancang untuk membantu Anda mendapatkan pekerjaan impian.Proyek nyata, yang akan meningkatkan pemahaman dan keterampilan Anda sebagai developer. Mulai perjalanan Anda untuk menjadi programmer andal dengan bergabung bersama BuildWithAngga, dan wujudkan karier impian Anda dengan percaya diri! 🚀

Kelas Apa itu Filament PHP pada Laravel dan Mengapa Web Developer Wajib Pake di BuildWithAngga

Apa itu Filament PHP pada Laravel dan Mengapa Web Developer Wajib Pake

Filament adalah paket admin panel yang dibangun khusus untuk Laravel dan dirancang agar developer dapat membuat dashboard dan halaman admin dengan cepat, mudah, dan fungsional. Filament menyediakan berbagai komponen antarmuka yang siap pakai, seperti form, tabel, dan fitur CRUD, yang secara signifikan mempercepat pengembangan halaman admin dalam proyek Laravel. Mengapa developer perlu belajar menggunakan Filament pada proyek Laravel? Pertama, Filament dirancang untuk mengikuti gaya dan ekosistem Laravel, sehingga sangat cocok bagi developer yang sudah terbiasa dengan framework tersebut. Kedua, Filament memungkinkan developer untuk membuat dashboard dan manajemen data dengan sedikit kode namun tetap fleksibel, sehingga meminimalkan waktu pengembangan. Ketiga, Filament menyediakan komponen-komponen canggih, seperti Wizard dan Relational Manager, yang mempermudah developer dalam menangani data yang kompleks. Bagi developer yang ingin meningkatkan produktivitas dan mempermudah manajemen aplikasi skala besar, Filament menjadi solusi tepat. Selain itu, komunitas Filament terus berkembang, menyediakan banyak dukungan dan dokumentasi yang membantu pemula dan profesional agar bisa memanfaatkan semua fitur dengan maksimal.

Kelas Cara Bikin Dashboard Steps dengan Filament Wizard dan Laravel di BuildWithAngga

Cara Bikin Dashboard Steps dengan Filament Wizard dan Laravel

Membuat dashboard admin yang menarik adalah langkah penting dalam menciptakan pengalaman pengguna yang baik dalam menggunakan website. Dashboard yang dirancang dengan baik akan memudahkan pengguna untuk berinteraksi, memahami data, dan mengelola konten di dalam aplikasi. Tidak hanya estetika, dashboard yang user-friendly juga memberikan navigasi yang jelas, fitur yang terorganisir, dan tata letak yang intuitif. Pengalaman pengguna yang positif dalam mengakses dashboard dapat meningkatkan kepercayaan dan kepuasan terhadap aplikasi, serta memperkuat loyalitas pengguna. Laravel dan Filament: Kombinasi Tepat untuk Dashboard Laravel adalah salah satu framework web development yang populer di kalangan developer karena performa, fleksibilitas, dan kemudahan penggunaannya. Laravel memungkinkan developer membangun aplikasi web dengan struktur yang rapi dan teratur, serta mendukung berbagai fitur untuk mempermudah proses development. Filament adalah library berbasis Laravel yang dirancang khusus untuk membuat dashboard dan halaman admin secara cepat dan efisien. Dengan Filament, proses membuat dashboard menjadi jauh lebih mudah karena library ini menyediakan komponen-komponen antarmuka yang siap pakai dan dapat dikustomisasi. Bagi para developer, Filament adalah solusi tepat untuk menghemat waktu tanpa harus memulai dari awal, sementara tetap mempertahankan kualitas tampilan dan performa aplikasi. Kelebihan Filament Wizard dalam Dashboard Steps Salah satu fitur menarik dari Filament adalah Wizard. Filament Wizard memungkinkan developer untuk membuat form dengan alur bertahap atau langkah-langkah yang terstruktur. Fitur ini sangat berguna ketika ingin mengelola input data yang kompleks namun mudah dipahami oleh pengguna. Wizard ini juga memberikan visualisasi proses yang tersegmentasi, sehingga pengguna dapat mengikuti proses dengan lebih mudah. Dengan menggunakan Wizard dari Filament, developer dapat membangun dashboard steps yang memandu pengguna melalui beberapa tahapan input data dengan alur yang jelas dan interaktif. Membuat Proyek Website Home Service dengan Laravel dan Composer Pertama, pastikan Composer telah terinstal di komputer Anda. Composer adalah manajer dependency PHP yang akan membantu menginstal Laravel dan semua dependensinya. Buka terminal dan buat proyek Laravel baru dengan menggunakan perintah berikut: composer create-project --prefer-dist laravel/laravel home-service Setelah proses instalasi selesai, masuk ke direktori proyek baru tersebut: cd home-service Selanjutnya, pastikan Laravel berjalan dengan benar. Jalankan server development Laravel dengan perintah: php artisan serve Akses aplikasi di browser dengan membuka URL http://localhost:8000. Jika muncul halaman welcome dari Laravel, proyek Anda telah berhasil dibuat. Mengatur File .env untuk Database MySQL pada Proyek Laravel Untuk menghubungkan proyek Laravel dengan MySQL, buka file .env di root proyek Anda. Cari bagian konfigurasi database, dan sesuaikan nilai-nilai berikut: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=username_mysql DB_PASSWORD=password_mysql Pastikan nilai DB_DATABASE, DB_USERNAME, dan DB_PASSWORD sesuai dengan database yang Anda buat di MySQL. Misalnya, jika Anda memiliki database bernama home_service_db, konfigurasi .env akan terlihat seperti ini: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=home_service_db DB_USERNAME=root DB_PASSWORD=12345 Setelah selesai mengatur konfigurasi, jalankan migrasi untuk memastikan Laravel terhubung dengan database dan membuat tabel sesuai dengan file migrasi: php artisan migrate Jika berhasil, maka tabel akan dibuat di database, dan proyek Laravel Anda siap menggunakan MySQL sebagai basis datanya. Membuat File Model dan Migration untuk Table Category, Home Services, dan Booking Transaction Untuk membuat tabel di Laravel, kita perlu membuat file model dan migration. Berikut adalah langkah-langkahnya untuk tabel Category, HomeService, dan BookingTransaction. Membuat Model dan Migration untuk Tabel Category Buka terminal di direktori proyek Laravel Anda. Buat model dan migration untuk tabel Category dengan perintah: php artisan make:model Category -m Perintah di atas akan membuat model Category dan file migration di database/migrations. Selanjutnya, buka file migration yang baru dibuat (biasanya memiliki nama yang mirip dengan xxxx_xx_xx_xxxxxx_create_categories_table.php). Di dalam file migration Category, tambahkan kolom-kolom yang diperlukan. Misalnya: Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name'); $table->text('description')->nullable(); $table->timestamps(); }); Simpan file ini, kemudian jalankan perintah migrasi untuk membuat tabel categories: php artisan migrate Membuat Model dan Migration untuk Tabel HomeService Selanjutnya, buat model dan migration untuk tabel HomeService dengan perintah berikut: php artisan make:model HomeService -m Buka file migration untuk HomeService di folder database/migrations. Tambahkan kolom-kolom yang diperlukan. Contoh kode untuk struktur tabel HomeService: Schema::create('home_services', function (Blueprint $table) { $table->id(); $table->foreignId('category_id')->constrained('categories')->onDelete('cascade'); $table->string('service_name'); $table->text('service_description')->nullable(); $table->decimal('price', 8, 2); $table->timestamps(); }); Di sini, category_id akan menjadi foreign key yang menghubungkan setiap layanan dengan kategori tertentu. Pastikan category_id dihubungkan ke tabel categories dan diberi fitur cascading delete. Setelah selesai, jalankan perintah migrasi: php artisan migrate Membuat Model dan Migration untuk Tabel BookingTransaction Buat model dan migration untuk tabel BookingTransaction dengan perintah berikut: php artisan make:model BookingTransaction -m Buka file migration untuk BookingTransaction yang baru saja dibuat. Tambahkan kolom-kolom sesuai dengan kebutuhan aplikasi. Contoh kode untuk struktur tabel BookingTransaction: Schema::create('booking_transactions', function (Blueprint $table) { $table->id(); $table->foreignId('home_service_id')->constrained('home_services')->onDelete('cascade'); $table->string('customer_name'); $table->string('customer_phone'); $table->date('booking_date'); $table->string('status')->default('pending'); $table->timestamps(); }); Dalam tabel ini, home_service_id adalah foreign key yang menghubungkan setiap transaksi dengan layanan tertentu. Kolom status dapat digunakan untuk mencatat status pemesanan, misalnya pending, confirmed, atau completed. Jalankan migrasi setelah menyimpan file: php artisan migrate Cara Mengatur File Model untuk Fillable dan Relationship pada Model Category, HomeService, dan BookingTransaction Pada langkah ini, kita akan menambahkan atribut fillable pada setiap model agar kolom-kolomnya dapat diisi massal (mass assignment) serta mengatur relasi antar model. Berikut penjelasannya untuk masing-masing model. Mengatur Model Category Buka file Category.php di dalam folder app/Models. Tambahkan properti fillable untuk kolom-kolom yang bisa diisi dan atur relasi dengan model HomeService. Berikut contoh kode lengkapnya: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Category extends Model { use HasFactory; protected $fillable = ['name', 'description']; public function homeServices() { return $this->hasMany(HomeService::class); } } Pada model Category: Properti fillable memungkinkan kolom name dan description untuk diisi secara massal.Method homeServices() mendefinisikan relasi hasMany dengan model HomeService, yang artinya satu kategori dapat memiliki banyak layanan. Mengatur Model HomeService Buka file HomeService.php di dalam folder app/Models. Tambahkan properti fillable untuk kolom-kolom yang bisa diisi dan atur relasi dengan model Category serta BookingTransaction. Berikut contoh kode lengkapnya: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class HomeService extends Model { use HasFactory; protected $fillable = ['category_id', 'service_name', 'service_description', 'price']; public function category() { return $this->belongsTo(Category::class); } public function bookingTransactions() { return $this->hasMany(BookingTransaction::class); } } Pada model HomeService: Properti fillable memungkinkan kolom category_id, service_name, service_description, dan price untuk diisi secara massal.Method category() mendefinisikan relasi belongsTo dengan model Category, yang menunjukkan bahwa setiap layanan home service terkait dengan satu kategori.Method bookingTransactions() mendefinisikan relasi hasMany dengan model BookingTransaction, yang artinya satu layanan dapat memiliki banyak transaksi booking. Mengatur Model BookingTransaction Buka file BookingTransaction.php di dalam folder app/Models. Tambahkan properti fillable untuk kolom-kolom yang bisa diisi dan atur relasi dengan model HomeService. Berikut contoh kode lengkapnya: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class BookingTransaction extends Model { use HasFactory; protected $fillable = ['home_service_id', 'customer_name', 'customer_phone', 'booking_date', 'status']; public function homeService() { return $this->belongsTo(HomeService::class); } } Pada model BookingTransaction: Properti fillable memungkinkan kolom home_service_id, customer_name, customer_phone, booking_date, dan status untuk diisi secara massal.Method homeService() mendefinisikan relasi belongsTo dengan model HomeService, yang menunjukkan bahwa setiap transaksi booking terkait dengan satu layanan home service. Ringkasan Relasi Antar Model Category memiliki relasi hasMany ke HomeService.HomeService memiliki relasi belongsTo ke Category dan hasMany ke BookingTransaction.BookingTransaction memiliki relasi belongsTo ke HomeService. Dengan demikian, relasi antar model telah diatur, dan kolom-kolom yang diperlukan telah ditambahkan ke properti fillable. Cara Menginstall Package Filament 3 dan Membuat Akun Super Admin Langkah 1: Menginstall Package Filament 3 Pastikan proyek Laravel Anda sudah siap. Buka terminal di direktori proyek Laravel Anda, lalu install Filament versi 3 menggunakan Composer: composer require filament/filament:"^3.0" Perintah ini akan menginstal Filament versi 3 dan semua dependensinya pada proyek Laravel Anda. Langkah 2: Memasang Filament dan Menyiapkan Konfigurasi Setelah instalasi selesai, jalankan perintah berikut untuk mempublikasi aset dan konfigurasi default dari Filament: php artisan vendor:publish --tag=filament-config File konfigurasi ini berada di config/filament.php dan dapat Anda sesuaikan dengan kebutuhan proyek, seperti pengaturan URL dashboard, middleware, dan tema. Langkah 3: Membuat Akun Super Admin dengan Perintah php artisan make:filament-user Untuk mengakses dashboard Filament, Anda perlu membuat akun super admin yang memiliki akses penuh. Filament menyediakan perintah Artisan untuk membuat pengguna ini dengan cepat. Jalankan perintah berikut di terminal: php artisan make:filament-user Perintah ini akan meminta Anda mengisi informasi akun untuk super admin. Masukkan data yang diminta sebagai berikut: Name: Masukkan nama untuk akun super admin, misalnya "Super Admin".Email: Masukkan email yang akan digunakan untuk login ke dashboard Filament, misalnya "[email protected]".Password: Masukkan password yang aman untuk akun super admin.Is Super Admin: Ketik yes untuk memberikan hak akses super admin. Contoh input: Name: Super Admin Email: [email protected] Password: password123 Is Super Admin (yes/no): yes Setelah Anda mengisi semua data, akun super admin akan dibuat. Anda bisa menggunakannya untuk login ke dashboard Filament. Langkah 4: Mengakses Dashboard Filament Setelah akun super admin berhasil dibuat, Anda dapat mengakses dashboard Filament melalui URL default http://localhost/admin. Gunakan email dan password yang telah Anda buat untuk masuk. Akun super admin kini memiliki akses penuh untuk mengelola semua fitur yang ada di dashboard Filament. Cara Membuat Resource untuk CRUD Data Category, Home Service, dan Booking Transaction Menggunakan Filament Filament menyediakan command yang mempermudah pembuatan resource CRUD secara otomatis. Berikut adalah langkah-langkahnya untuk membuat resource CRUD pada data Category, HomeService, dan BookingTransaction. Langkah 1: Membuat Resource CRUD untuk Data Category Buka terminal di direktori proyek Laravel Anda. Buat resource CRUD untuk data Category menggunakan perintah berikut: php artisan make:filament-resource Category Filament akan membuat file resource di dalam folder app/Filament/Resources/CategoryResource.php. Buka file tersebut untuk melihat pengaturan CRUD yang telah dihasilkan otomatis oleh Filament. Di dalam CategoryResource.php, Anda dapat menyesuaikan form dan tabel untuk CRUD data Category. Berikut contoh penyesuaian di dalam method form dan table: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name') ->required() ->label('Category Name'), Textarea::make('description') ->label('Description') ->nullable(), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name')->label('Category Name'), TextColumn::make('description')->label('Description'), TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } Langkah 2: Membuat Resource CRUD untuk Data Home Service Lanjutkan dengan membuat resource untuk HomeService menggunakan perintah berikut di terminal: php artisan make:filament-resource HomeService Filament akan membuat resource baru di app/Filament/Resources/HomeServiceResource.php. Buka file ini untuk mengonfigurasi form dan tabel CRUD untuk HomeService. Berikut adalah contoh pengaturan method form dan table di dalam file HomeServiceResource.php: public static function form(Form $form): Form { return $form ->schema([ Select::make('category_id') ->relationship('category', 'name') ->required() ->label('Category'), TextInput::make('service_name') ->required() ->label('Service Name'), Textarea::make('service_description') ->label('Service Description') ->nullable(), TextInput::make('price') ->numeric() ->required() ->label('Price'), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('category.name')->label('Category'), TextColumn::make('service_name')->label('Service Name'), TextColumn::make('price')->label('Price')->money('USD', true), TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } Cara Membuat Resource untuk Booking Transaction dan Menggunakan Component Wizard di Filament Filament menyediakan cara mudah untuk membuat resource CRUD dengan tampilan bertahap (wizard) agar data yang kompleks bisa diinput dalam beberapa langkah. Berikut adalah panduan langkah demi langkah untuk membuat resource CRUD pada BookingTransaction dengan komponen Wizard untuk input data baru. Langkah 1: Membuat Resource BookingTransaction Buka terminal di direktori proyek Laravel Anda. Buat resource untuk BookingTransaction dengan perintah berikut: php artisan make:filament-resource BookingTransaction Filament akan menghasilkan file resource baru bernama BookingTransactionResource.php di dalam folder app/Filament/Resources. Buka file tersebut untuk mengatur form dengan komponen Wizard. Langkah 2: Menggunakan Component Wizard untuk Input Data Baru Pada file BookingTransactionResource.php, kita akan memodifikasi method form agar menggunakan komponen Wizard. Wizard ini akan membagi proses input data BookingTransaction menjadi beberapa langkah yang terstruktur. Contoh kode untuk membuat form Wizard: use Filament\\\\Forms\\\\Components\\\\Wizard; use Filament\\\\Forms\\\\Components\\\\Wizard\\\\Step; use Filament\\\\Forms\\\\Components\\\\TextInput; use Filament\\\\Forms\\\\Components\\\\DatePicker; use Filament\\\\Forms\\\\Components\\\\Select; public static function form(Form $form): Form { return $form ->schema([ Wizard::make([ Step::make('Customer Information') ->schema([ TextInput::make('customer_name') ->required() ->label('Customer Name'), TextInput::make('customer_phone') ->required() ->label('Customer Phone'), ]), Step::make('Service Selection') ->schema([ Select::make('home_service_id') ->relationship('homeService', 'service_name') ->required() ->label('Select Home Service'), DatePicker::make('booking_date') ->required() ->label('Booking Date'), ]), Step::make('Booking Status') ->schema([ Select::make('status') ->options([ 'pending' => 'Pending', 'confirmed' => 'Confirmed', 'completed' => 'Completed', ]) ->default('pending') ->required() ->label('Status'), ]), ]) ]); } Pada kode di atas: Wizard::make([]) digunakan untuk membungkus form dalam format bertahap (wizard).Step::make('Customer Information') membuat langkah pertama, di mana informasi pelanggan seperti customer_name dan customer_phone diinput.Step::make('Service Selection') membuat langkah kedua, di mana pengguna memilih layanan home service dan tanggal booking.Step::make('Booking Status') membuat langkah ketiga, di mana pengguna memilih status pemesanan (status). Dengan cara ini, proses input data untuk BookingTransaction dibagi menjadi beberapa tahap, sehingga lebih mudah dipahami dan diikuti oleh pengguna. Langkah 3: Mengakses dan Menguji Form Wizard di Dashboard Filament Setelah form wizard untuk BookingTransaction diatur, jalankan server Laravel: php artisan serve Kemudian buka URL http://localhost/admin di browser dan login dengan akun admin. Cari menu BookingTransaction dan coba tambahkan data baru. Anda akan melihat form bertahap yang dibuat menggunakan komponen Wizard, yang memandu pengguna dalam mengisi data BookingTransaction selangkah demi selangkah. Dengan Wizard ini, input data yang kompleks dapat diatur dengan rapi, sehingga meningkatkan pengalaman pengguna dalam menggunakan dashboard Filament. Penutup Membangun fitur CRUD dan mengelola data dengan komponen seperti Filament Wizard sangat membantu dalam menciptakan aplikasi yang interaktif dan mudah digunakan. Dengan menggunakan Laravel dan Filament, programmer dapat membuat dashboard yang rapi, efisien, dan mendukung pengalaman pengguna yang lebih baik. Namun, untuk benar-benar menguasai teknik-teknik seperti ini, belajar bersama mentor yang berpengalaman sangat direkomendasikan. Di BuildWithAngga, Anda bisa belajar bersama para expert yang siap membantu Anda memahami konsep-konsep penting dalam web development. Dengan mengikuti kelas di BuildWithAngga, Anda akan mendapatkan akses selamanya ke materi kursus, konsultasi langsung dengan mentor, serta kesempatan membangun portfolio menarik yang dapat meningkatkan peluang Anda dalam dunia kerja. Jadi, jangan ragu untuk bergabung dan memperdalam kemampuan programming Anda di BuildWithAngga!

Kelas Tutorial Fitur Role Management dengan Laravel 11, Filament 3, dan Spatie 6 Projek Toko Buah di BuildWithAngga

Tutorial Fitur Role Management dengan Laravel 11, Filament 3, dan Spatie 6 Projek Toko Buah

Dalam era digital saat ini, perusahaan dituntut untuk memiliki website yang modern dan kaya fitur, terutama bagi mereka yang menjual jasa atau produk. Website bukan hanya menjadi etalase digital, tetapi juga memberikan nilai lebih kepada pengguna dengan menghadirkan fitur-fitur yang meningkatkan pengalaman mereka. Misalnya, pengguna ingin merasakan kenyamanan saat melakukan transaksi, berinteraksi dengan konten, hingga mendapatkan layanan yang dipersonalisasi berdasarkan kebutuhan mereka. Di sinilah pentingnya sebuah sistem manajemen peran (role management) yang terstruktur dengan baik. Dengan sistem manajemen peran, perusahaan dapat memberikan hak akses yang berbeda kepada pengguna berdasarkan perannya. Misalnya, admin memiliki akses penuh untuk mengelola produk, transaksi, dan pengguna, sementara pelanggan hanya bisa melihat dan membeli produk. Manajemen peran ini memberikan keamanan lebih pada sistem, memastikan bahwa hanya pihak yang berwenang yang dapat melakukan tindakan tertentu. Laravel menjadi pilihan framework yang tepat untuk membangun website modern semacam ini. Dengan fitur-fitur yang lengkap dan komunitas developer yang besar, Laravel mempermudah proses development. Selain itu, Laravel juga dikenal sebagai framework yang aman, cepat, dan scalable, sehingga cocok untuk membangun website dengan berbagai fitur kompleks. Ditambah dengan integrasi dengan Filament 3 sebagai admin panel yang kuat, dan Spatie 6 sebagai package untuk manajemen peran dan izin, proses development menjadi lebih cepat dan terorganisir. Filament 3: Solusi Cepat untuk Membangun Dashboard Admin Dalam proses pembuatan website modern, pengelolaan konten dan data di belakang layar menjadi sangat penting, terutama bagi admin yang perlu mengelola produk, transaksi, atau pengguna. Untuk itu, dibutuhkan sebuah dashboard admin yang mudah digunakan dan fungsional. Filament 3 hadir sebagai solusi cepat bagi developer yang ingin membangun dashboard admin dengan lebih efisien. Package ini dirancang khusus untuk Laravel dan memudahkan proses pembuatan dashboard yang interaktif, lengkap dengan berbagai fitur seperti pengelolaan data, tabel, dan form yang dapat diintegrasikan dengan mudah. Dengan menggunakan Filament 3, developer tidak perlu memulai semuanya dari nol. Fitur-fitur seperti tabel yang sudah dioptimalkan, integrasi form, hingga manajemen data bisa dibangun dengan cepat. Ini sangat membantu perusahaan yang membutuhkan dashboard admin yang user-friendly untuk mempermudah pekerjaan tim internal mereka. Filament 3 juga memiliki fleksibilitas untuk disesuaikan dengan kebutuhan spesifik proyek, sehingga mempermudah developer dalam menambahkan fitur tambahan sesuai kebutuhan klien. Spatie Laravel Permission: Package Populer untuk User Roles Spatie Laravel Permission merupakan salah satu package terpopuler di ekosistem Laravel untuk membangun fitur manajemen peran dan izin (user roles and permissions) pada sebuah website modern. Di dunia web development, fitur ini menjadi sangat penting untuk memastikan bahwa setiap pengguna mendapatkan hak akses yang sesuai dengan perannya. Misalnya, dalam sebuah sistem e-commerce, ada peran seperti admin, pelanggan, atau manajer toko, di mana masing-masing memiliki tingkat akses yang berbeda. Spatie menyediakan berbagai fitur untuk memudahkan developer dalam mengelola peran dan izin ini, tanpa harus membangun semuanya dari awal. Dengan integrasi yang mulus ke dalam Laravel, Spatie Laravel Permission memungkinkan developer untuk mengatur siapa saja yang bisa mengakses halaman tertentu, mengelola produk, atau melakukan transaksi. Paket ini sangat fleksibel dan mudah digunakan, serta dapat diandalkan untuk membangun website yang aman dan terstruktur dengan baik. Membangun Fitur Role Management pada Website Toko Buah Online Pada artikel ini, kita akan belajar bagaimana membuat fitur role management untuk sebuah website toko buah online. Dalam proyek ini, kita akan menggunakan kombinasi Laravel 11, Filament 3, dan Spatie Laravel Permission untuk mengelola peran pengguna. Website ini akan memiliki beberapa role, seperti: Admin: memiliki akses penuh untuk mengelola semua aspek di dalam website, termasuk menambah atau menghapus produk, melihat laporan penjualan, dan mengelola pengguna.Merchant: peran ini diberikan kepada penjual buah yang dapat menambah, mengedit, dan menghapus produk mereka sendiri, serta memantau pesanan yang masuk dari pelanggan.Customer: pengguna biasa yang hanya memiliki akses untuk menjelajah produk, melakukan pembelian, dan melihat status pesanan mereka. Dengan sistem role management ini, kita dapat memastikan bahwa setiap pengguna hanya bisa mengakses fitur-fitur yang sesuai dengan hak dan tanggung jawab mereka. Hal ini penting untuk menjaga keamanan, efisiensi, dan pengalaman pengguna yang optimal pada website. Membuat Proyek Toko Buah dengan Laravel Berikut adalah panduan lengkap untuk membuat proyek toko buah menggunakan Laravel melalui terminal, mengatur koneksi database MySQL, serta membuat migration dan model untuk tabel products, categories, dan transactions. Install Laravel Melalui Composer Langkah pertama adalah menginstall Laravel. Buka terminal dan jalankan perintah berikut untuk membuat proyek Laravel baru: composer create-project --prefer-dist laravel/laravel toko-buah Setelah instalasi selesai, masuk ke direktori proyek: cd toko-buah Mengatur File .env untuk Koneksi Database MySQL Setelah proyek Laravel berhasil dibuat, buka file .env yang ada di root folder proyek. Ubah konfigurasi database agar sesuai dengan setup MySQL di komputer lokal: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=root DB_PASSWORD= Gantilah nama_database dengan nama database yang kamu buat di MySQL. Pastikan MySQL sudah aktif dan database yang dimaksud sudah tersedia. Membuat Migration dan Model untuk Produk (Product) Langkah selanjutnya adalah membuat migration dan model untuk tabel produk. Jalankan perintah berikut di terminal: php artisan make:model Product -m Perintah di atas akan membuat model Product beserta file migration-nya. Buka file migration yang ada di database/migrations, lalu modifikasi fungsi up untuk menambahkan struktur tabel products: public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->decimal('price', 8, 2); $table->integer('stock'); $table->unsignedBigInteger('category_id'); $table->timestamps(); $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); }); } Tabel products akan memiliki kolom name, price, stock, serta relasi category_id yang terhubung ke tabel categories. Membuat Migration dan Model untuk Kategori (Category) Buat model dan migration untuk tabel kategori menggunakan perintah berikut: php artisan make:model Category -m Setelah itu, buka file migration yang dihasilkan dan sesuaikan dengan struktur berikut: public function up() { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); } Tabel categories ini akan digunakan untuk mengelompokkan produk berdasarkan kategori buah. Membuat Migration dan Model untuk Transaksi (Transactions) Selanjutnya, buat model dan migration untuk tabel transaksi dengan perintah ini: php artisan make:model Transaction -m Kemudian, modifikasi file migration untuk tabel transactions seperti berikut: public function up() { Schema::create('transactions', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('product_id'); $table->integer('quantity'); $table->decimal('total_price', 8, 2); $table->timestamps(); $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); }); } Tabel transactions akan menyimpan informasi tentang produk yang dibeli dan jumlah pembelian (quantity), serta total harga (total_price). Menjalankan Migration Setelah semua migration telah dibuat dan dimodifikasi, jalankan perintah berikut untuk membuat tabel di database: php artisan migrate Perintah ini akan membuat tabel products, categories, dan transactions di database yang sudah terhubung melalui file .env. Cara Menginstall dan Menggunakan Package Spatie Permission di Laravel Berikut adalah langkah-langkah untuk menginstall package Spatie Laravel Permission dalam proyek Laravel, lengkap dengan contoh koding. Install Package Spatie Laravel Permission Buka terminal, pastikan kamu berada di dalam direktori proyek Laravel, lalu jalankan perintah berikut untuk menginstall package Spatie Laravel Permission: composer require spatie/laravel-permission Setelah package berhasil diinstall, kamu perlu meng-publish file konfigurasi dan migration-nya dengan menjalankan perintah ini: php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider" Perintah ini akan menghasilkan file konfigurasi permission.php di direktori config dan file migration untuk tabel roles, permissions, dan tabel pivot untuk menghubungkan pengguna dengan role dan permission. Jalankan Migration Setelah mem-publish file konfigurasi, jalankan perintah berikut untuk membuat tabel yang diperlukan oleh Spatie di database: php artisan migrate Ini akan membuat tabel roles, permissions, dan tabel pivot seperti model_has_roles, model_has_permissions, dan role_has_permissions di database. Setup Model User Buka file User.php di direktori app/Models. Tambahkan trait HasRoles dari Spatie ke dalam model User agar pengguna dapat diberikan role dan permission. Berikut adalah contohnya: namespace App\\\\Models; use Illuminate\\\\Foundation\\\\Auth\\\\User as Authenticatable; use Spatie\\\\Permission\\\\Traits\\\\HasRoles; class User extends Authenticatable { use HasRoles; // kode lainnya } Dengan menambahkan trait HasRoles, kamu bisa mulai memberikan role dan permission kepada pengguna. Cara Menginstall Package Filament dan Membuat Filament Resource untuk Category, Product, User, Role, dan Permission Berikut ini adalah langkah-langkah lengkap untuk menginstall package Filament di proyek Laravel dan membuat resource admin untuk mengelola Category, Product, User, Role, dan Permission dengan Filament. Install Package Filament Untuk menginstall Filament, pastikan kamu sudah berada di dalam folder proyek Laravel di terminal. Jalankan perintah berikut untuk menginstall package Filament: composer require filament/filament Setelah package berhasil diinstall, jalankan perintah berikut untuk mem-publish aset dan konfigurasi Filament: php artisan filament:install Perintah ini akan mengatur konfigurasi awal Filament dan membuat dashboard admin yang bisa langsung diakses. Jalankan Migration Jika proses instalasi Filament sudah selesai, pastikan kamu menjalankan migration agar tabel-tabel yang dibutuhkan oleh Filament dapat terbentuk: php artisan migrate Membuat Filament Resource untuk Category Untuk membuat resource Category di Filament, gunakan perintah berikut di terminal: php artisan make:filament-resource Category Ini akan menghasilkan resource CategoryResource yang terletak di folder app/Filament/Resources/CategoryResource.php. Di file ini, kamu dapat menyesuaikan form dan tabel untuk pengelolaan data kategori. Contoh sederhana dari form dan tabel untuk Category bisa seperti ini: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name')->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name'), TextColumn::make('created_at')->dateTime(), ]) ->filters([]); } Membuat Filament Resource untuk Product Untuk membuat resource Product, jalankan perintah ini di terminal: php artisan make:filament-resource Product Setelah resource Product dibuat, kamu bisa menyesuaikan form dan tabel di file ProductResource.php. Misalnya: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name')->required(), TextInput::make('price')->numeric()->required(), Select::make('category_id') ->relationship('category', 'name')->required(), TextInput::make('stock')->numeric()->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name'), TextColumn::make('price')->money('USD'), TextColumn::make('stock'), TextColumn::make('category.name')->label('Category'), TextColumn::make('created_at')->dateTime(), ]) ->filters([]); } Membuat Filament Resource untuk User Untuk membuat resource User, jalankan perintah berikut: php artisan make:filament-resource User Sesuaikan form dan tabel di UserResource.php. Contoh implementasi form dan tabel untuk User: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name')->required(), TextInput::make('email')->email()->required(), PasswordInput::make('password')->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name'), TextColumn::make('email'), TextColumn::make('created_at')->dateTime(), ]) ->filters([]); } Membuat Filament Resource untuk Role Jika kamu menggunakan package Spatie untuk role management, berikut cara membuat resource Role: php artisan make:filament-resource Role Di dalam RoleResource.php, sesuaikan form dan tabel untuk mengelola role. Misalnya: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name')->required(), MultiSelect::make('permissions') ->relationship('permissions', 'name'), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name'), TextColumn::make('permissions.name')->label('Permissions')->limit(3), ]) ->filters([]); } Membuat Filament Resource untuk Permission Untuk resource Permission, jalankan perintah: php artisan make:filament-resource Permission Di dalam file PermissionResource.php, kamu bisa menyesuaikan form dan tabelnya sebagai berikut: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('name')->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('name'), TextColumn::make('created_at')->dateTime(), ]) ->filters([]); } Dengan mengikuti langkah-langkah di atas, kamu telah berhasil menginstall package Filament dan membuat resource untuk Category, Product, User, Role, dan Permission. Filament memudahkan pembuatan panel admin yang interaktif, lengkap dengan pengelolaan role dan permission menggunakan Spatie, sehingga pengembangan menjadi lebih cepat dan terstruktur. Membatasi Akses Dashboard Filament Hanya untuk User dengan Role Admin Setelah menambahkan Filament resource untuk Role dan memastikan role Admin sudah ada di database, kita akan memodifikasi model User agar hanya pengguna dengan role Admin yang dapat mengakses dashboard Filament. Untuk ini, kita akan menggunakan method canAccessPanel. Pastikan Trait HasRoles Sudah Ditambahkan di Model User Buka file app/Models/User.php dan tambahkan trait HasRoles dari Spatie Laravel Permission untuk mendukung fitur role management. Ini memungkinkan kita menggunakan method seperti hasRole untuk memeriksa apakah pengguna memiliki role tertentu. namespace App\\\\Models; use Illuminate\\\\Foundation\\\\Auth\\\\User as Authenticatable; use Spatie\\\\Permission\\\\Traits\\\\HasRoles; class User extends Authenticatable { use HasRoles; // Kode lainnya } Tambahkan Method canAccessPanel di Model User Filament akan memeriksa method canAccessPanel untuk menentukan apakah seorang pengguna memiliki akses ke dashboard. Tambahkan method ini di dalam model User untuk memverifikasi apakah pengguna memiliki role Admin. Buka file app/Models/User.php dan tambahkan method canAccessPanel berikut: public function canAccessPanel(): bool { return $this->hasRole('Admin'); } Method canAccessPanel akan mengembalikan true hanya jika pengguna memiliki role Admin. Dengan begitu, hanya pengguna dengan role Admin yang akan diizinkan untuk mengakses dashboard Filament. Cara Menguji Konfigurasi Pastikan role Admin sudah ada di database. Jika belum, tambahkan role ini menggunakan Filament dashboard atau melalui Tinker: php artisan tinker use App\\\\Models\\\\User; use Spatie\\\\Permission\\\\Models\\\\Role; Role::firstOrCreate(['name' => 'Admin']); $user = User::find(1); // Sesuaikan dengan ID user yang ingin diberi akses $user->assignRole('Admin'); Login ke dashboard Filament menggunakan akun pengguna yang memiliki role Admin. Jika konfigurasi canAccessPanel sudah benar, hanya user dengan role Admin yang dapat mengakses dashboard, sementara pengguna lain akan ditolak aksesnya. Dengan konfigurasi ini, akses ke dashboard Filament sekarang terbatas hanya untuk pengguna yang memiliki role Admin. Menambahkan Role Merchant dan Customer serta Beberapa Permission pada Proyek dengan Filament Resource Setelah sebelumnya menambahkan role Admin, kita akan menambahkan role Merchant dan Customer, serta beberapa permission yang relevan dengan proyek ini menggunakan Filament Resource. Dengan konfigurasi ini, kita dapat mengelola role dan permission dari dashboard Filament. Tambahkan Role Merchant dan Customer melalui Filament Pastikan RoleResource sudah dibuat dengan Filament. Untuk menambahkan role Merchant dan Customer, buka dashboard Filament di URL yang telah dikonfigurasi (biasanya /admin). Pada dashboard Filament: Masuk ke menu Roles yang disediakan oleh RoleResource.Klik tombol Create atau Add Role.Tambahkan role Merchant dengan mengisi nama role dan menyimpannya.Ulangi langkah yang sama untuk menambahkan role Customer. Tambahkan Permission Baru melalui Filament Jika sudah ada PermissionResource, kita bisa menambahkan permission yang dibutuhkan untuk setiap role. Pada dashboard Filament: Akses menu Permissions dari PermissionResource.Klik Create atau Add Permission untuk membuat permission baru.Tambahkan permission yang sesuai, seperti view products, manage own products, purchase products, dan view orders.Setelah menambahkan permission, klik Save. Mengatur Permission untuk Role Merchant dan Customer Setelah menambahkan role dan permission, kita bisa menetapkan permission yang sesuai untuk setiap role. Sebagai contoh: Merchant memiliki izin seperti view products dan manage own products.Customer memiliki izin view products dan purchase products. Pada dashboard Filament: Masuk ke menu Roles.Pilih role Merchant dan atur permissions-nya, seperti view products dan manage own products.Simpan perubahan.Pilih role Customer dan tetapkan permissions view products dan purchase products.Simpan perubahan. Menambahkan Role Merchant dan Customer serta Permissions Menggunakan Seeder (Opsional) Jika kamu ingin menambahkan role dan permission ini secara programatis, kamu bisa menggunakan seeder. Buat seeder RolePermissionSeeder jika belum ada: php artisan make:seeder RolePermissionSeeder Buka file database/seeders/RolePermissionSeeder.php dan tambahkan kode berikut untuk membuat role Merchant dan Customer serta permissions: namespace Database\\\\Seeders; 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', 'manage own products', 'purchase products', 'view orders', ]; foreach ($permissions as $permission) { Permission::firstOrCreate(['name' => $permission]); } // Buat roles dan tetapkan permissions $adminRole = Role::firstOrCreate(['name' => 'Admin']); $merchantRole = Role::firstOrCreate(['name' => 'Merchant']); $customerRole = Role::firstOrCreate(['name' => 'Customer']); // Admin memiliki semua permissions $adminRole->syncPermissions(Permission::all()); // Merchant memiliki permission tertentu $merchantRole->syncPermissions([ 'view products', 'manage own products', 'view orders', ]); // Customer memiliki permission tertentu $customerRole->syncPermissions([ 'view products', 'purchase products', ]); } } Setelah menambahkan kode ini, jalankan seeder untuk membuat role dan permission secara otomatis di database: php artisan db:seed --class=RolePermissionSeeder Cara Membuat 10 Route Utama pada Proyek Toko Buah dan Melindungi dengan Role dan Permission Dalam proyek toko buah, kita akan membuat 10 route utama yang akan dilindungi menggunakan role dan permission yang telah ditambahkan sebelumnya. Role seperti Admin, Merchant, dan Customer akan memiliki akses terbatas sesuai dengan permission yang telah diatur. Di Laravel, middleware digunakan untuk memastikan hanya pengguna dengan role dan permission tertentu yang bisa mengakses route yang sudah ditentukan. Route untuk Menampilkan Produk (Dapat Diakses oleh Semua Role) Route ini digunakan untuk menampilkan daftar produk yang tersedia di toko. Role Admin, Merchant, dan Customer semuanya bisa mengakses halaman ini karena permission view products diberikan kepada semua role. Route::get('/products', function () { // Logic untuk menampilkan semua produk })->middleware('permission:view products'); Route untuk Menambah Produk (Hanya untuk Merchant dan Admin) Pada halaman ini, pengguna dengan role Admin dan Merchant dapat menambahkan produk baru ke toko. Hanya pengguna dengan role ini dan permission manage own products yang dapat mengakses halaman ini. Route::get('/products/create', function () { // Logic untuk menampilkan form tambah produk })->middleware(['role:Admin|Merchant', 'permission:manage own products']); Route untuk Menyimpan Produk Baru (Hanya untuk Merchant dan Admin) Route ini digunakan untuk menyimpan produk baru yang telah ditambahkan oleh Admin atau Merchant. Setelah mengisi form pada halaman sebelumnya, data produk akan disimpan melalui route ini. Route::post('/products', function () { // Logic untuk menyimpan produk baru })->middleware(['role:Admin|Merchant', 'permission:manage own products']); Route untuk Mengedit Produk (Hanya untuk Merchant dan Admin) Route ini mengizinkan pengguna dengan role Merchant dan Admin untuk mengedit produk yang ada. Hanya produk yang ditambahkan oleh mereka yang dapat diedit (untuk Merchant), atau semua produk (untuk Admin). Route::get('/products/{id}/edit', function ($id) { // Logic untuk menampilkan form edit produk })->middleware(['role:Admin|Merchant', 'permission:manage own products']); Route untuk Memperbarui Produk (Hanya untuk Merchant dan Admin) Setelah melakukan perubahan pada produk, route ini digunakan untuk memperbarui data produk di database. Hanya Merchant dan Admin yang memiliki akses untuk memperbarui produk. Route::put('/products/{id}', function ($id) { // Logic untuk memperbarui data produk })->middleware(['role:Admin|Merchant', 'permission:manage own products']); Route untuk Menghapus Produk (Hanya untuk Admin) Hanya pengguna dengan role Admin yang diizinkan untuk menghapus produk dari toko. Permission delete products dibutuhkan untuk melakukan tindakan ini. Route::delete('/products/{id}', function ($id) { // Logic untuk menghapus produk })->middleware(['role:Admin', 'permission:delete products']); Route untuk Menampilkan Daftar Pesanan (Hanya untuk Admin dan Merchant) Route ini digunakan untuk menampilkan daftar semua pesanan yang ada di sistem. Baik Admin maupun Merchant dapat melihat daftar pesanan, namun role Customer tidak memiliki akses. Route::get('/orders', function () { // Logic untuk menampilkan semua pesanan })->middleware(['role:Admin|Merchant', 'permission:view orders']); Route untuk Membuat Pesanan Baru (Hanya untuk Customer) Route ini digunakan oleh Customer untuk membuat pesanan baru. Setelah memilih produk, Customer akan diarahkan ke route ini untuk menyelesaikan pesanan mereka. Route::post('/orders', function () { // Logic untuk membuat pesanan baru })->middleware(['role:Customer', 'permission:purchase products']); Route untuk Menampilkan Detail Pesanan (Hanya untuk Customer dan Merchant) Customer dan Merchant dapat melihat detail dari pesanan tertentu. Merchant hanya bisa melihat pesanan yang terkait dengan produk yang mereka kelola, sementara Customer bisa melihat pesanan mereka sendiri. Route::get('/orders/{id}', function ($id) { // Logic untuk menampilkan detail pesanan })->middleware(['role:Customer|Merchant', 'permission:view orders']); Route untuk Mengelola Pengguna (Hanya untuk Admin) Hanya Admin yang memiliki akses untuk mengelola data pengguna lain di dalam sistem. Mereka dapat melihat daftar pengguna dan mengelola hak akses mereka. Route::get('/users', function () { // Logic untuk menampilkan daftar pengguna })->middleware(['role:Admin', 'permission:manage users']); Dengaan menggunakan middleware role dan permission, kita dapat mengamankan setiap route dalam aplikasi toko buah sesuai dengan hak akses yang diberikan kepada setiap pengguna. Pendekatan ini memungkinkan pembatasan akses yang terstruktur, memaastikan bahwa pengguna hanya bisa melakukan tindakan yang sesuai dengan role dan permission mereka. Penutup Laravel terus berkembang dan semakin populer berkat pembaruan-pembaruan menarik yang memudahkan developer dalam membangun aplikasi web yang kuat dan scalable. Fitur-fitur baru yang hadir secara berkala membuat Laravel tetap relevan dan menjadi pilihan utama bagi banyak developer di seluruh dunia. Untuk tetap mendapatkan ilmu terkini dan memaksimalkan kemampuan dalam menggunakan Laravel, pantau terus website BuildWithAngga. Di sana, kamu bisa menemukan banyak kelas gratis yang mencakup studi kasus menarik dan diajarkan oleh mentor berpengalaman. Selain itu, BuildWithAngga menawarkan akses seumur hidup, memungkinkan kamu untuk belajar kapan saja dan memastikan kamu selalu siap menghadapi tantangan baru di dunia web development.

Kelas Tutorial Laravel 10 Cara Bikin Admin CMS dengan Filament Projek Web Order Coffee Shop di BuildWithAngga

Tutorial Laravel 10 Cara Bikin Admin CMS dengan Filament Projek Web Order Coffee Shop

Kali ini kita akan belajar membuat halaman admin dan Content Management System (CMS) untuk website order coffee di sebuah cafe shop dengan menggunakan Laravel 10 dan Filament. Tujuan dari latihan ini adalah memberikan kemampuan bagi pemilik cafe untuk mengelola menu, harga, dan berbagai konten lainnya secara mandiri, tanpa perlu pengetahuan mendalam tentang coding. Halaman admin yang akan kita buat ini nantinya berfungsi sebagai pusat kendali untuk segala aktivitas manajemen konten di website, seperti menambah atau menghapus menu coffee, membuat promo spesial, serta memperbarui informasi yang tampil di website secara real-time. Laravel 10 dan Filament: Kombinasi Tepat untuk Dashboard dan CMS Menggunakan Laravel 10 dan Filament merupakan pilihan yang tepat dalam membangun dashboard serta CMS yang aman, cepat, dan mudah dimaintenance. Laravel 10, sebagai framework PHP yang sudah terkenal dengan keamanannya, akan memberikan fondasi yang kuat untuk website Anda. Di sisi lain, Filament memungkinkan Anda membuat dashboard admin yang interaktif dan mudah digunakan dengan antarmuka yang sederhana namun fungsional. Jika diibaratkan, Laravel 10 adalah fondasi yang kokoh, sementara Filament adalah alat yang memudahkan Anda untuk membangun struktur di atasnya, seperti merancang tampilan dan fungsi admin dengan mudah. Kombinasi ini tidak hanya memudahkan dari segi pengembangan, tetapi juga dalam hal maintenance dan perbaikan di masa depan. Dengan Filament, pemilik cafe shop dapat melakukan perubahan pada konten website kapan saja tanpa perlu repot menghubungi developer. Inilah yang membuat Laravel 10 dan Filament sangat cocok untuk membangun CMS yang handal, efisien, dan aman dalam mengelola informasi di website. Cara Membuat Projek Laravel 10 Menggunakan Composer dan Mengatur File .env MySQL Untuk memulai projek dengan Laravel 10, kita perlu menggunakan Composer, yaitu dependency manager untuk PHP yang memudahkan kita dalam mengelola paket-paket yang dibutuhkan oleh Laravel. Selain itu, kita juga harus mengonfigurasi koneksi database MySQL di file .env agar aplikasi Laravel dapat terhubung dengan database. Berikut adalah langkah-langkah dan contoh lengkap untuk membuat projek Laravel 10 beserta pengaturan MySQL. 1. Instalasi Laravel 10 Menggunakan Composer Langkah pertama adalah membuka terminal atau command prompt, kemudian menjalankan perintah Composer untuk membuat projek Laravel 10. composer create-project --prefer-dist laravel/laravel order-coffee "10.*" Perintah ini akan mengunduh dan menginstall Laravel versi 10 ke dalam folder bernama order-coffee. Anda bisa mengganti nama folder tersebut sesuai dengan kebutuhan projek Anda. Setelah instalasi selesai, masuk ke direktori projek: cd order-coffee Kemudian, jalankan server lokal Laravel dengan perintah berikut: php artisan serve Server Laravel akan berjalan pada http://localhost:8000 atau alamat yang ditampilkan pada terminal Anda. Sekarang, aplikasi Laravel sudah terpasang dan bisa diakses melalui browser. 2. Mengatur Koneksi Database MySQL di File .env Setelah berhasil membuat projek Laravel 10, langkah selanjutnya adalah mengatur koneksi ke database MySQL. Laravel menyimpan pengaturan koneksi ini di file .env yang terletak di root direktori projek. Buka file .env dengan teks editor dan cari bagian berikut: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=root DB_PASSWORD= Penjelasan setiap variabel di atas: DB_CONNECTION: Jenis database yang digunakan, dalam hal ini mysql.DB_HOST: Host dari database, biasanya 127.0.0.1 atau localhost.DB_PORT: Port yang digunakan oleh MySQL, secara default adalah 3306.DB_DATABASE: Nama database yang ingin Anda gunakan. Buat database baru di MySQL dengan nama ini.DB_USERNAME: Username untuk mengakses MySQL, biasanya root untuk lokal.DB_PASSWORD: Password MySQL untuk root atau sesuai dengan yang telah Anda atur. Contoh jika Anda membuat database bernama order_coffee, username root, dan tanpa password, maka pengaturan .env akan terlihat seperti ini: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=order_coffee DB_USERNAME=root DB_PASSWORD= Jangan lupa untuk menyimpan file .env setelah mengeditnya. 3. Menjalankan Migrasi Database Setelah konfigurasi database selesai, langkah selanjutnya adalah menjalankan migrasi untuk membuat tabel-tabel dasar di database. Laravel menyediakan beberapa tabel bawaan yang berguna, seperti tabel users, yang dapat kita buat dengan perintah berikut: php artisan migrate Jika koneksi ke database berhasil, tabel-tabel akan dibuat di database order_coffee. Sekarang, Laravel sudah terhubung dengan MySQL dan siap digunakan untuk membuat fitur-fitur lainnya dalam projek order coffee. Anda sudah berhasil membuat projek Laravel 10 dengan konfigurasi MySQL menggunakan Composer dan file .env. Untuk mempelajari lebih lanjut tentang cara mengelola database dan tabel dengan Laravel, Anda bisa mengunjungi dokumentasi resmi Laravel. Cara Membuat File Migration dan Model Beserta Fillable dan Relationship untuk Table Categories, Coffees, Cafes, Transactions Dalam projek kelas seperti order coffee, kita membutuhkan beberapa tabel untuk menyimpan data yang diperlukan. Tabel-tabel tersebut bisa diwakili oleh beberapa model dan relasi di Laravel, seperti categories, coffees, cafes, dan transactions. Berikut ini adalah cara membuat file migration dan model untuk masing-masing tabel, serta mengatur fillable dan relationship antara tabel-tabel tersebut. 1. Membuat Migration untuk Tabel Categories Untuk membuat file migration dan model untuk tabel categories, gunakan perintah berikut di terminal: php artisan make:model Category -m Perintah ini akan membuat model Category beserta file migration untuk tabel categories. Buka file migration di database/migrations/, kemudian tambahkan kolom-kolom yang diperlukan untuk tabel categories: public function up() { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); } Pada model Category, tambahkan properti fillable untuk menentukan field yang dapat diisi: class Category extends Model { protected $fillable = ['name']; public function coffees() { return $this->hasMany(Coffee::class); } } Relasi hasMany digunakan karena satu kategori bisa memiliki banyak coffee. 2. Membuat Migration untuk Tabel Coffees Buat model dan migration untuk tabel coffees dengan perintah berikut: php artisan make:model Coffee -m Setelah itu, buka file migration untuk coffees dan tambahkan kolom-kolom yang diperlukan: public function up() { Schema::create('coffees', function (Blueprint $table) { $table->id(); $table->string('name'); $table->decimal('price', 8, 2); $table->unsignedBigInteger('category_id'); $table->timestamps(); $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); }); } Pada model Coffee, tambahkan properti fillable dan buat relasi belongsTo untuk menghubungkan coffee dengan category: class Coffee extends Model { protected $fillable = ['name', 'price', 'category_id']; public function category() { return $this->belongsTo(Category::class); } public function cafes() { return $this->belongsToMany(Cafe::class); } } Relasi belongsToMany di sini digunakan karena satu coffee bisa dijual di banyak cafe. 3. Membuat Migration untuk Tabel Cafes Buat model dan migration untuk tabel cafes dengan perintah berikut: php artisan make:model Cafe -m Edit file migration untuk cafes dan tambahkan kolom-kolom yang dibutuhkan: public function up() { Schema::create('cafes', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('location'); $table->timestamps(); }); } Pada model Cafe, tambahkan properti fillable dan buat relasi belongsToMany untuk menghubungkan cafe dengan coffee: class Cafe extends Model { protected $fillable = ['name', 'location']; public function coffees() { return $this->belongsToMany(Coffee::class); } public function transactions() { return $this->hasMany(Transaction::class); } } Satu cafe bisa melakukan banyak transaksi, sehingga relasi hasMany digunakan untuk tabel transactions. 4. Membuat Migration untuk Tabel Transactions Buat model dan migration untuk transactions dengan perintah berikut: php artisan make:model Transaction -m Edit file migration untuk transactions dengan menambahkan kolom-kolom yang dibutuhkan: public function up() { Schema::create('transactions', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('cafe_id'); $table->unsignedBigInteger('coffee_id'); $table->integer('quantity'); $table->decimal('total_price', 8, 2); $table->timestamps(); $table->foreign('cafe_id')->references('id')->on('cafes')->onDelete('cascade'); $table->foreign('coffee_id')->references('id')->on('coffees')->onDelete('cascade'); }); } Pada model Transaction, tambahkan properti fillable dan buat relasi belongsTo untuk menghubungkan transaksi dengan coffee dan cafe: class Transaction extends Model { protected $fillable = ['cafe_id', 'coffee_id', 'quantity', 'total_price']; public function cafe() { return $this->belongsTo(Cafe::class); } public function coffee() { return $this->belongsTo(Coffee::class); } } Cara Menginstall Package Filament dan Membuat Akun Admin Filament adalah package yang memudahkan kita dalam membuat halaman admin yang lengkap dengan fitur CRUD untuk projek Laravel. Dengan Filament, kita bisa membuat dashboard admin dengan cepat dan mudah. Berikut adalah cara menginstall Filament dan membuat akun admin. Menginstall Filament di Laravel 10 Langkah pertama untuk memulai adalah dengan menginstall Filament. Pastikan Anda sudah berada di root direktori projek Laravel. Jalankan perintah berikut di terminal untuk menginstall package Filament: composer require filament/filament Setelah proses instalasi selesai, kita bisa menjalankan beberapa perintah tambahan untuk memastikan bahwa Filament terpasang dengan benar dan siap digunakan. Mengatur Filament dengan Artisan Setelah menginstall Filament, Anda perlu menjalankan perintah berikut untuk mengatur konfigurasi dasar dari Filament. Perintah ini akan membuat beberapa file dasar yang diperlukan untuk dashboard admin Filament. php artisan filament:install Perintah ini akan mempersiapkan segala kebutuhan Filament dalam projek Anda, seperti file konfigurasi dan rute untuk dashboard admin. Membuat Akun Admin Untuk bisa masuk ke halaman admin, kita perlu membuat akun admin terlebih dahulu. Filament mendukung pembuatan user dengan role admin. Anda bisa menggunakan Artisan untuk membuat user baru dengan role admin. Jalankan perintah berikut untuk membuat admin: php artisan make:filament-user Setelah menjalankan perintah ini, Anda akan diminta untuk mengisi beberapa informasi seperti nama, email, password, dan apakah user tersebut merupakan super admin. Isi informasi tersebut sesuai kebutuhan. Jika akun berhasil dibuat, Anda akan melihat pesan konfirmasi di terminal. Contoh Kode Pengaturan User Admin Setelah akun admin berhasil dibuat, Anda dapat mengakses dashboard admin Filament melalui URL berikut: <http://localhost:8000/admin> Pastikan Anda sudah menjalankan server Laravel dengan php artisan serve, dan gunakan akun admin yang baru saja dibuat untuk login ke dashboard tersebut. Akun admin yang telah Anda buat memiliki hak akses penuh untuk mengelola data di halaman dashboard. Cara Membuat Resource untuk CRUD Seluruh Table yang Sudah Dibuat Menggunakan Filament Dalam sebuah projek, kita dapat memanfaatkan Filament untuk membuat CRUD (Create, Read, Update, Delete) secara otomatis pada seluruh tabel yang sudah kita buat sebelumnya, seperti categories, coffees, cafes, dan transactions. Dengan menggunakan resource di Filament, kita bisa mengelola data dalam tabel tersebut melalui halaman admin yang sudah terintegrasi dengan dashboard. Berikut adalah cara membuat resource untuk masing-masing tabel. Menggunakan Artisan untuk Membuat Resource Untuk membuat resource CRUD di Filament, Anda bisa menggunakan perintah Artisan. Misalnya, untuk membuat resource untuk tabel categories, jalankan perintah berikut di terminal: php artisan make:filament-resource Category Perintah ini akan membuat resource yang mencakup fitur CRUD untuk tabel categories, termasuk tampilan antarmuka untuk membuat, mengedit, menghapus, dan melihat data kategori. Lakukan hal yang sama untuk tabel coffees, cafes, dan transactions dengan menyesuaikan nama modelnya: php artisan make:filament-resource Coffee php artisan make:filament-resource Cafe php artisan make:filament-resource Transaction Contoh Koding Resource untuk Categories Setelah perintah di atas dijalankan, Filament akan otomatis membuat file resource di direktori app/Filament/Resources/CategoryResource.php. Buka file tersebut dan Anda akan menemukan struktur dasar dari resource. Berikut adalah contoh implementasi dasar resource untuk Category: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CategoryResource\\\\Pages; use App\\\\Models\\\\Category; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Forms; use Filament\\\\Tables; class CategoryResource extends Resource { protected static string $model = Category::class; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('name'), Tables\\\\Columns\\\\TextColumn::make('created_at') ->dateTime(), ]) ->filters([]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListCategories::route('/'), 'create' => Pages\\\\CreateCategory::route('/create'), 'edit' => Pages\\\\EditCategory::route('/{record}/edit'), ]; } } Bagian form() digunakan untuk mendefinisikan input apa saja yang dibutuhkan saat membuat atau mengedit data kategori, sedangkan bagian table() digunakan untuk menampilkan kolom-kolom apa yang akan muncul di halaman daftar kategori. Contoh Koding Resource untuk Coffees Untuk tabel coffees, resource akan diatur serupa dengan categories, namun dengan penambahan field seperti price dan relasi ke categories. Berikut adalah contoh resource Coffee: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CoffeeResource\\\\Pages; use App\\\\Models\\\\Coffee; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Forms; use Filament\\\\Tables; class CoffeeResource extends Resource { protected static string $model = Coffee::class; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required(), Forms\\\\Components\\\\TextInput::make('price') ->numeric() ->required(), Forms\\\\Components\\\\Select::make('category_id') ->relationship('category', 'name') ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('name'), Tables\\\\Columns\\\\TextColumn::make('price')->money('USD'), Tables\\\\Columns\\\\TextColumn::make('category.name'), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListCoffees::route('/'), 'create' => Pages\\\\CreateCoffee::route('/create'), 'edit' => Pages\\\\EditCoffee::route('/{record}/edit'), ]; } } Dalam resource ini, Anda dapat melihat field tambahan untuk harga (price) serta dropdown yang menampilkan kategori (category_id) menggunakan relasi dari model Category. Menambahkan Resource untuk Cafes dan Transactions Langkah yang sama dapat diterapkan pada tabel cafes dan transactions. Pada CafeResource, Anda bisa menambahkan field seperti name dan location. Sedangkan di TransactionResource, tambahkan input untuk cafe_id, coffee_id, quantity, dan total_price. Berikut adalah contoh singkat untuk TransactionResource: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\TransactionResource\\\\Pages; use App\\\\Models\\\\Transaction; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Forms; use Filament\\\\Tables; class TransactionResource extends Resource { protected static string $model = Transaction::class; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\Select::make('cafe_id') ->relationship('cafe', 'name') ->required(), Forms\\\\Components\\\\Select::make('coffee_id') ->relationship('coffee', 'name') ->required(), Forms\\\\Components\\\\TextInput::make('quantity') ->numeric() ->required(), Forms\\\\Components\\\\TextInput::make('total_price') ->numeric() ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('cafe.name'), Tables\\\\Columns\\\\TextColumn::make('coffee.name'), Tables\\\\Columns\\\\TextColumn::make('quantity'), Tables\\\\Columns\\\\TextColumn::make('total_price')->money('USD'), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListTransactions::route('/'), 'create' => Pages\\\\CreateTransaction::route('/create'), 'edit' => Pages\\\\EditTransaction::route('/{record}/edit'), ]; } } Dengan resource ini, Anda dapat melakukan CRUD untuk semua transaksi yang terjadi di cafe, termasuk mencatat coffee yang dipesan, jumlah, dan total harga. Cara Membuat Export Button pada Tabel Transactions di Filament Untuk menambahkan fitur Export Button pada tabel Transactions yang sudah dibuat sebelumnya di Filament, kita akan memanfaatkan custom action di resource Filament. Fitur ini memungkinkan pengguna untuk mengekspor seluruh data dari tabel transactions ke format seperti CSV atau Excel. Berikut adalah cara membuat Export Button pada tabel Transactions beserta contoh koding lengkapnya. Langkah 1: Menambahkan Custom Action untuk Export Buka file TransactionResource.php yang berada di direktori app/Filament/Resources/TransactionResource.php. Di dalam metode table(), kita bisa menambahkan custom action untuk melakukan export data. Berikut adalah contoh implementasi custom action: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\TransactionResource\\\\Pages; use App\\\\Models\\\\Transaction; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Forms; use Filament\\\\Tables; use Filament\\\\Tables\\\\Actions\\\\Action; use Illuminate\\\\Database\\\\Eloquent\\\\Builder; use Maatwebsite\\\\Excel\\\\Facades\\\\Excel; use App\\\\Exports\\\\TransactionsExport; class TransactionResource extends Resource { protected static string $model = Transaction::class; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\Select::make('cafe_id') ->relationship('cafe', 'name') ->required(), Forms\\\\Components\\\\Select::make('coffee_id') ->relationship('coffee', 'name') ->required(), Forms\\\\Components\\\\TextInput::make('quantity') ->numeric() ->required(), Forms\\\\Components\\\\TextInput::make('total_price') ->numeric() ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('cafe.name'), Tables\\\\Columns\\\\TextColumn::make('coffee.name'), Tables\\\\Columns\\\\TextColumn::make('quantity'), Tables\\\\Columns\\\\TextColumn::make('total_price')->money('USD'), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->actions([ Action::make('export') ->label('Export Transactions') ->action(function () { return Excel::download(new TransactionsExport, 'transactions.xlsx'); }), ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListTransactions::route('/'), 'create' => Pages\\\\CreateTransaction::route('/create'), 'edit' => Pages\\\\EditTransaction::route('/{record}/edit'), ]; } } Pada contoh di atas, kita membuat custom Action bernama export yang akan menampilkan tombol Export Transactions di halaman daftar Transactions. Ketika tombol tersebut diklik, data akan diekspor dalam format Excel dengan menggunakan Maatwebsite Excel. Langkah 2: Membuat TransactionsExport Class Untuk melakukan export ke format Excel, kita perlu membuat sebuah class yang menghandle proses export. Gunakan perintah berikut di terminal untuk membuat class export: php artisan make:export TransactionsExport --model=Transaction Class export ini akan dibuat di direktori app/Exports/TransactionsExport.php. Edit file tersebut dan tambahkan kode berikut untuk mengekspor seluruh data dari tabel transactions: namespace App\\\\Exports; use App\\\\Models\\\\Transaction; use Maatwebsite\\\\Excel\\\\Concerns\\\\FromCollection; class TransactionsExport implements FromCollection { /** * Return a collection of data to be exported. */ public function collection() { return Transaction::all(); } } Class ini mengambil semua data dari tabel transactions dan mengekspornya sebagai file Excel. Langkah 3: Menginstall Maatwebsite Excel Jika Anda belum menginstall package Maatwebsite Excel, Anda bisa menginstallnya dengan perintah berikut: composer require maatwebsite/excel Setelah menginstall package ini, Laravel sudah siap untuk mengekspor data ke berbagai format file, seperti Excel atau CSV. Langkah 4: Menguji Export Button Setelah semua konfigurasi diatur, jalankan aplikasi Laravel Anda, buka halaman Transactions di dashboard Filament, dan Anda akan melihat tombol Export Transactions. Ketika tombol tersebut diklik, file transactions.xlsx akan diunduh, berisi seluruh data dari tabel transactions. Dengan cara ini, Anda berhasil menambahkan fitur Export Button di halaman Transactions menggunakan Filament dan Maatwebsite Excel. Penutup Dengan mengikuti langkah-langkah di atas, Anda sekarang dapat dengan mudah menambahkan fitur Export Button pada tabel Transactions menggunakan Filament dan Maatwebsite Excel di Laravel. Fitur ini memungkinkan admin untuk mengekspor seluruh data transaksi dalam format Excel, yang sangat berguna untuk keperluan laporan atau analisis lebih lanjut. Menambah fitur seperti ini bukan hanya memudahkan proses pengelolaan data, tetapi juga menunjukkan betapa fleksibelnya Laravel dan Filament dalam mengembangkan sistem admin yang kuat dan efisien. Jika Anda ingin lebih mendalami Laravel dan Filament serta meningkatkan keterampilan web development Anda, Anda bisa belajar bersama mentor expert di Buildwithangga. Anda akan mendapatkan banyak manfaat seperti portfolio siap kerja, akses materi selamanya, serta bimbingan private yang akan membantu Anda siap menghadapi tantangan di dunia kerja. Bergabunglah dan maksimalkan potensi Anda dengan dukungan mentor yang berpengalaman!

Kelas Tutorial Pake Laravel Policy Pada Projek Website Koskosan di BuildWithAngga

Tutorial Pake Laravel Policy Pada Projek Website Koskosan

Dalam membangun sebuah website yang besar dan kompleks, misalnya website pencarian dan penyewaan kos-kosan, keamanan dan kontrol akses menjadi salah satu aspek yang penting. Salah satu fitur Laravel yang sangat membantu untuk mengelola akses ini adalah Policy. Dengan menggunakan Policy, kita bisa memastikan bahwa hanya pengguna tertentu yang dapat mengakses fitur tertentu berdasarkan aturan yang kita tentukan. Bayangkan seperti ini: Sebuah website kos-kosan memiliki berbagai jenis pengguna, mulai dari pengguna Basic hingga pengguna Gold. Pengguna Gold, karena mereka membayar lebih, memiliki akses ke lebih banyak fitur. Misalnya, mereka bisa mengklaim paket katering khusus. Nah, di sinilah Policy berperan. Dengan Laravel Policy, kita bisa membatasi agar hanya pengguna Gold yang bisa mengakses fitur klaim paket katering ini, sementara pengguna Basic tidak bisa. Mengapa Laravel Policy Penting? Policy di Laravel memungkinkan kita untuk membuat aturan yang spesifik untuk siapa yang bisa melakukan tindakan tertentu pada resource tertentu. Misalnya, kita ingin hanya pengguna dengan status Gold yang bisa mengakses link tertentu di website kos-kosan. Jadi, link untuk mengklaim paket katering hanya bisa diakses oleh pengguna yang memenuhi syarat, dan ini dikendalikan dengan Policy. Contoh Implementasi Laravel Policy di Website Koskosan Untuk menerapkan Policy di Laravel, kita perlu membuat sebuah Policy dengan perintah artisan: php artisan make:policy CateringPolicy Policy ini akan berisi metode yang menentukan apakah pengguna memiliki hak untuk mengklaim paket katering. Contohnya: namespace App\\\\Policies; use App\\\\Models\\\\User; class CateringPolicy { /** * Tentukan apakah pengguna bisa mengklaim paket katering. */ public function claimCatering(User $user) { return $user->level === 'Gold'; } } Setelah Policy ini dibuat, kita perlu menghubungkannya dengan AuthServiceProvider. Di file app/Providers/AuthServiceProvider.php, kita daftarkan Policy ini: use App\\\\Models\\\\User; use App\\\\Policies\\\\CateringPolicy; class AuthServiceProvider extends ServiceProvider { protected $policies = [ User::class => CateringPolicy::class, ]; public function boot() { $this->registerPolicies(); } } Sekarang, saat pengguna mencoba mengakses fitur klaim paket katering, kita bisa menggunakan Policy ini untuk memeriksa apakah mereka memiliki izin yang cukup. Di controller, kita bisa menambahkan: public function claimCatering() { if (Gate::denies('claimCatering', auth()->user())) { abort(403, 'Anda tidak memiliki akses untuk klaim paket katering.'); } // Lanjutkan dengan logika klaim paket katering } 1. Fitur Reservasi Kamar Khusus Beberapa kamar kos mungkin hanya tersedia untuk pengguna dengan level tertentu, seperti pengguna Platinum atau Gold. Laravel Policy dapat diterapkan untuk membatasi siapa yang bisa melakukan reservasi untuk kamar-kamar eksklusif ini. Contoh Policy: public function reserveExclusiveRoom(User $user) { return $user->level === 'Platinum' || $user->level === 'Gold'; } Pengguna Basic tidak akan bisa melakukan reservasi pada kamar eksklusif ini, dan akan diarahkan untuk memilih kamar lainnya. 2. Fitur Diskon Spesial Pengguna dengan level tertentu, misalnya Gold, bisa mendapatkan diskon khusus ketika menyewa kamar atau layanan tambahan seperti laundry atau Wi-Fi. Policy bisa digunakan untuk memastikan hanya pengguna yang memenuhi syarat yang bisa mengklaim diskon tersebut. Contoh Policy: public function applyDiscount(User $user) { return $user->level === 'Gold'; } Di controller, kita bisa memeriksa apakah pengguna memenuhi syarat diskon sebelum mengaplikasikan potongan harga. 3. Akses Ke Event Khusus Misalnya, website kos-kosan juga menawarkan akses ke acara-acara khusus seperti webinar atau acara offline bagi penghuni kos. Hanya pengguna yang memiliki level tertentu yang diizinkan untuk mendaftar dan mengikuti acara tersebut. Policy bisa digunakan untuk membatasi akses ini. Contoh Policy: public function accessEvent(User $user) { return $user->level === 'Platinum'; } Pengguna dengan level di bawah Platinum akan dicegah untuk mendaftar. 4. Fitur Ulasan Kamar Kebijakan website bisa mengatur bahwa hanya pengguna yang sudah menyelesaikan pembayaran atau tinggal di kos lebih dari 1 bulan yang boleh memberikan ulasan atau review pada kamar. Policy akan membantu memverifikasi apakah pengguna tersebut berhak menulis ulasan berdasarkan status mereka. Contoh Policy: public function writeReview(User $user) { return $user->hasCompletedPayment(); } Policy ini akan mencegah pengguna yang belum pernah tinggal di kos untuk memberikan ulasan palsu. 5. Fitur Upgrade Level Pengguna Beberapa pengguna mungkin ingin meng-upgrade akun mereka dari level Basic ke Gold untuk menikmati fasilitas tambahan seperti akses ke kamar eksklusif atau paket katering. Fitur ini dapat menggunakan Policy untuk memastikan hanya pengguna yang memenuhi kriteria (misalnya telah membayar biaya upgrade) yang bisa mengakses proses upgrade. Contoh Policy: public function upgradeAccount(User $user) { return $user->canUpgrade(); } Ini memastikan bahwa hanya pengguna yang memenuhi syarat yang bisa melakukan upgrade, mencegah penyalahgunaan sistem. Analogi Laravel Policy Bayangkan Policy di Laravel seperti seorang petugas keamanan di depan pintu akses khusus sebuah gedung. Hanya orang-orang yang memiliki kartu identitas Gold yang diizinkan masuk. Jika seseorang dengan kartu identitas Basic mencoba masuk, mereka akan dihentikan oleh petugas tersebut. Dalam hal ini, Laravel Policy bertindak sebagai “petugas keamanan” yang memeriksa siapa yang boleh dan tidak boleh mengakses fitur tertentu. Dengan Policy, kita dapat mengelola akses ke fitur-fitur sensitif di website kos-kosan secara lebih mudah dan efisien. Tidak hanya itu, Policy juga memastikan bahwa setiap tindakan yang diambil pengguna dalam aplikasi kita sesuai dengan aturan yang telah ditentukan, meningkatkan keamanan dan pengalaman pengguna secara keseluruhan. Untuk mempelajari lebih lanjut tentang Policy di Laravel, kamu bisa baca dokumentasi resmi Laravel. Dengan menerapkan Policy ini, kita bisa memastikan bahwa website kos-kosan kita aman dan fitur-fitur penting seperti klaim paket katering hanya bisa diakses oleh pengguna yang memenuhi syarat. Penutup dan saran Laravel terus menjadi salah satu framework yang paling populer di kalangan developer, terutama karena selalu menghadirkan update menarik yang memudahkan pengembangan website. Dengan fitur-fitur canggih seperti Policy, Eloquent ORM, dan sistem routing yang fleksibel, Laravel memberikan solusi lengkap untuk membangun aplikasi yang aman, cepat, dan mudah dikelola. Untuk terus mengikuti perkembangan terbaru seputar Laravel, jangan lupa pantau terus website BuildWithAngga. Mereka sering mengadakan update kelas gratis dengan studi kasus menarik, dibimbing oleh mentor berpengalaman. Keunggulannya, kamu juga mendapatkan akses kelas seumur hidup, yang sangat cocok bagi siapa saja yang ingin terus belajar dan memperdalam skill programming mereka.

Kelas Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website E-learning Online di BuildWithAngga

Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website E-learning Online

Dalam dunia web development, membuat fitur seperti CRUD, login, atau registrasi sudah menjadi hal yang umum. Namun, ada satu langkah penting yang sering diabaikan oleh banyak programmer, yaitu unit testing. Bayangkan kita sedang membangun sebuah website e-learning, misalnya, yang memiliki banyak fitur seperti pengelolaan kursus, sistem registrasi, dan pengelolaan konten pembelajaran. Setiap fitur tersebut membutuhkan unit testing untuk memastikan bahwa semua berjalan dengan baik dan mempermudah tim dalam melakukan uji coba serta mengurangi risiko terjadinya bug di kemudian hari. Mengapa Unit Testing Penting? Analoginya seperti ini: bayangkan Anda sedang membangun sebuah rumah. Setiap kali Anda selesai membangun satu bagian, Anda akan memeriksa apakah bagian tersebut kokoh dan sesuai dengan rencana. Jika ada kesalahan, Anda bisa langsung memperbaikinya sebelum melanjutkan ke bagian lain. Unit testing berfungsi seperti pemeriksaan ini dalam pembangunan website. Setiap kali kita membuat fungsi atau fitur, kita bisa langsung menguji apakah fitur tersebut bekerja sesuai dengan yang diharapkan sebelum melanjutkan ke fitur berikutnya. Dengan begitu, ketika seluruh website selesai dibuat, kita tidak perlu khawatir lagi akan adanya error di setiap bagian. 5 Fitur Utama pada Website E-learning Online Website e-learning yang efektif harus memiliki beberapa fitur utama untuk memberikan pengalaman belajar yang optimal. Berikut lima fitur penting yang biasanya ada: 1) Daftar Kursus Fitur ini memungkinkan pengguna untuk melihat dan mencari kursus berdasarkan kategori, tingkat kesulitan, atau topik tertentu. Pengguna bisa mendapatkan informasi lengkap seperti deskripsi, durasi, dan profil instruktur untuk memilih kursus yang tepat. 2) Sistem Registrasi Fitur ini memudahkan pengguna untuk membuat akun dan mendaftar kursus. Selain itu, sistem registrasi membantu melacak progres belajar pengguna, mengelola akses ke konten premium, dan memberikan notifikasi terkait aktivitas kursus. 3) Fitur Ujian dan Kuis Ujian dan kuis membantu pengguna menguji pemahaman mereka terhadap materi. Fitur ini biasanya mencakup soal pilihan ganda, isian singkat, atau essay dengan penilaian otomatis dan umpan balik langsung. 4) Manajemen Konten Pembelajaran Instruktur dapat mengelola materi pembelajaran seperti video, dokumen, dan presentasi. Materi dapat disusun dalam modul atau bab untuk memberikan pembelajaran yang terstruktur dan mudah diakses. 5) Sistem Penilaian Peserta Fitur ini memungkinkan instruktur memberikan penilaian berdasarkan hasil ujian, tugas, dan partisipasi. Peserta dapat melihat progres mereka dan mendapatkan umpan balik yang membantu memperbaiki hasil belajar. Cara Membuat Proyek Laravel 11 Baru dengan Composer dan Mengatur .env untuk Unit Testing Untuk memulai proyek Laravel 11, buka terminal dan jalankan perintah berikut untuk mengunduh dan membuat proyek baru: composer create-project --prefer-dist laravel/laravel elearning-platform Setelah proyek berhasil dibuat, masuk ke direktori proyek: cd elearning-platform Selanjutnya, lakukan konfigurasi pada file .env yang ada di root proyek. Sesuaikan pengaturan database agar dapat digunakan untuk unit testing. Misalnya, gunakan database sqlite yang biasanya digunakan untuk keperluan testing: DB_CONNECTION=sqlite DB_DATABASE=/path/to/database/testing.sqlite Jangan lupa untuk membuat file testing.sqlite di direktori yang sudah ditentukan. Anda bisa menggunakan perintah berikut di terminal: touch /path/to/database/testing.sqlite Untuk mempermudah unit testing, pastikan Anda sudah menjalankan perintah berikut untuk membuat database testing: php artisan migrate Contoh Koding Pengujian untuk Fitur Registrasi Kursus Buat file test baru untuk pengujian registrasi kursus dengan menggunakan perintah: php artisan make:test CourseRegistrationTest Kemudian, tambahkan pengujian berikut di file tests/Feature/CourseRegistrationTest.php: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class CourseRegistrationTest extends TestCase { use RefreshDatabase; public function test_user_can_register_for_a_course() { $user = User::factory()->create(); $this->actingAs($user); $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => $user->id, ]); $response->assertStatus(200); $response->assertSee('Kursus berhasil didaftarkan'); } } Contoh Koding Pengujian untuk Fitur Manajemen Konten Pembelajaran Buat file test baru untuk menguji manajemen konten pembelajaran: php artisan make:test ContentManagementTest Tambahkan kode berikut di file tests/Feature/ContentManagementTest.php: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Content; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ContentManagementTest extends TestCase { use RefreshDatabase; public function test_instructor_can_add_content() { $instructor = User::factory()->create(['role' => 'instructor']); $this->actingAs($instructor); $response = $this->post('/contents', [ 'title' => 'Laravel Basics', 'description' => 'Introduction to Laravel framework.', 'content' => 'This is the content for the Laravel Basics module.', ]); $response->assertStatus(201); $this->assertDatabaseHas('contents', [ 'title' => 'Laravel Basics' ]); } public function test_instructor_can_update_content() { $instructor = User::factory()->create(['role' => 'instructor']); $this->actingAs($instructor); $content = Content::factory()->create(); $response = $this->put("/contents/{$content->id}", [ 'title' => 'Updated Laravel Basics', 'description' => 'Updated introduction to Laravel framework.', 'content' => 'This is the updated content for the Laravel Basics module.', ]); $response->assertStatus(200); $this->assertDatabaseHas('contents', [ 'title' => 'Updated Laravel Basics' ]); } } Tata Cara Membuat dan Mengatur File Unit Testing untuk 5 Fitur E-learning Untuk membuat dan mengatur file unit testing bagi kelima fitur, Anda bisa menggunakan php artisan make:test untuk membuat file test secara terpisah. Misalnya, Anda ingin membuat file test untuk sistem registrasi, manajemen konten, dan sistem penilaian peserta. Buat file test untuk masing-masing fitur: php artisan make:test CourseRegistrationTest php artisan make:test ContentManagementTest php artisan make:test AssessmentSystemTest Pada file CourseRegistrationTest.php, tambahkan pengujian untuk registrasi kursus: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Course; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class CourseRegistrationTest extends TestCase { use RefreshDatabase; public function test_user_can_register_for_course() { $user = User::factory()->create(); $course = Course::factory()->create(); $this->actingAs($user); $response = $this->post('/courses/register', [ 'course_id' => $course->id, 'user_id' => $user->id, ]); $response->assertStatus(200); $response->assertJson([ 'message' => 'Kursus berhasil didaftarkan' ]); } } Pada file ContentManagementTest.php, tambahkan pengujian untuk manajemen konten: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Content; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ContentManagementTest extends TestCase { use RefreshDatabase; public function test_instructor_can_create_content() { $instructor = User::factory()->create(['role' => 'instructor']); $this->actingAs($instructor); $response = $this->post('/contents', [ 'title' => 'Laravel Basics', 'description' => 'Introduction to Laravel', 'content' => 'This is the content of Laravel Basics.', ]); $response->assertStatus(201); $this->assertDatabaseHas('contents', [ 'title' => 'Laravel Basics' ]); } } Pada file AssessmentSystemTest.php, tambahkan pengujian untuk sistem penilaian peserta: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Course; use App\\\\Models\\\\Assessment; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class AssessmentSystemTest extends TestCase { use RefreshDatabase; public function test_instructor_can_give_assessment() { $instructor = User::factory()->create(['role' => 'instructor']); $course = Course::factory()->create(['instructor_id' => $instructor->id]); $student = User::factory()->create(); $this->actingAs($instructor); $response = $this->post("/courses/{$course->id}/assessments", [ 'student_id' => $student->id, 'score' => 85, 'feedback' => 'Good job!' ]); $response->assertStatus(201); $this->assertDatabaseHas('assessments', [ 'student_id' => $student->id, 'score' => 85, 'feedback' => 'Good job!' ]); } } Dengan cara ini, Anda dapat membuat dan mengatur file unit testing untuk masing-masing fitur e-learning secara terpisah, sehingga setiap fitur dapat diuji secara mendetail dan terstruktur. Menggunakan RefreshDatabase di Laravel tidak akan menghapus data asli pada server production karena RefreshDatabase secara otomatis bekerja hanya di environment testing. Laravel memisahkan pengaturan environment untuk pengujian, development, dan production. Saat melakukan pengujian, Laravel akan menggunakan file .env.testing atau konfigurasi testing yang berbeda dari environment production. Jadi, secara default, RefreshDatabase akan mereset database hanya untuk pengujian, bukan untuk environment production. Namun, untuk memastikan keamanan lebih lanjut, penting bagi developer untuk mengikuti beberapa langkah preventif agar data production tetap aman: Periksa Environment: Pastikan aplikasi menggunakan environment testing saat menjalankan unit test. Ini bisa diatur di file phpunit.xml atau file .env.testing. Dengan cara ini, database yang digunakan untuk pengujian tidak akan sama dengan database production.Gunakan SQLite atau Database Terpisah untuk Testing: Anda bisa menggunakan SQLite (in-memory database) atau database terpisah hanya untuk keperluan pengujian. Dengan demikian, tidak ada risiko database production terkena dampak pengujian.Hindari Menjalankan Pengujian di Production: Jangan pernah menjalankan perintah testing di environment production. Anda bisa menambahkan pengecekan di kode untuk memastikan pengujian tidak dijalankan di production. Berikut adalah contoh koding sederhana untuk memastikan RefreshDatabase hanya digunakan di environment testing: <?php namespace Tests\\\\Feature; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ExampleTest extends TestCase { use RefreshDatabase; protected function setUp(): void { parent::setUp(); // Pastikan unit test hanya berjalan di environment testing if (app()->environment() !== 'testing') { $this->markTestSkipped('Testing hanya boleh dijalankan di environment testing.'); } } public function test_example() { // Contoh pengujian sederhana $this->assertTrue(true); } } Kode di atas memastikan bahwa pengujian akan dilewati jika environment yang digunakan bukan testing. Dengan melakukan langkah-langkah ini, Anda bisa menghindari potensi risiko menghapus data asli pada server production saat melakukan unit testing. Kesalahan Umum Ketika Melakukan Unit Testing pada Projek E-learning Online Dalam melakukan unit testing pada proyek e-learning online, ada beberapa kesalahan yang sering terjadi dan dapat menyebabkan pengujian menjadi tidak efektif atau bahkan berdampak negatif pada lingkungan pengembangan. Berikut adalah tiga kesalahan umum yang perlu dihindari: 1) Tidak Menggunakan Database Testing Salah satu kesalahan yang sering dilakukan adalah menggunakan database asli atau production untuk pengujian. Ini sangat berisiko karena dapat mengubah atau merusak data penting yang ada di database asli. Sebagai gantinya, sebaiknya gunakan database testing seperti SQLite atau database sementara yang terpisah dari database utama. Contoh kesalahan: // Menggunakan database MySQL production secara langsung config(['database.connections.mysql.database' => 'production_db']); public function test_course_registration() { $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 1, ]); $response->assertStatus(200); } Perbaikan: Gunakan database testing yang aman dan terisolasi: // Menggunakan SQLite untuk pengujian config(['database.connections.sqlite.database' => ':memory:']); public function test_course_registration() { $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 1, ]); $response->assertStatus(200); } 2) Menghubungkan ke Layanan Video Hosting Langsung Pada aplikasi e-learning, terkadang diperlukan integrasi dengan layanan video hosting seperti YouTube atau Vimeo untuk menampilkan konten pembelajaran. Menghubungkan langsung ke layanan ini dalam pengujian dapat menyebabkan pengujian menjadi lambat dan tidak stabil, terutama jika layanan tersebut mengalami downtime atau masalah koneksi. Contoh kesalahan: public function test_video_content_is_accessible() { // Menghubungkan ke API YouTube langsung $response = Http::get('<https://www.googleapis.com/youtube/v3/videos>', [ 'id' => 'video_id', 'key' => 'API_KEY' ]); $response->assertStatus(200); } Perbaikan: Gunakan mock atau simulasi untuk meniru respons dari layanan eksternal: use Illuminate\\\\Support\\\\Facades\\\\Http; public function test_video_content_is_accessible() { // Simulasi respons dari API YouTube Http::fake([ '<https://www.googleapis.com/youtube/v3/videos>' => Http::response([ 'items' => [ ['id' => 'video_id', 'status' => 'public'] ] ], 200) ]); $response = Http::get('<https://www.googleapis.com/youtube/v3/videos>', [ 'id' => 'video_id', 'key' => 'API_KEY' ]); $response->assertStatus(200); } 3) Membuat Pengujian yang Terlalu Kompleks Kesalahan lain adalah membuat pengujian yang terlalu kompleks dan sulit dipelihara. Pengujian yang mencakup terlalu banyak skenario dalam satu test case akan sulit dipahami dan di-debug. Pengujian sebaiknya fokus pada satu skenario spesifik dan menggunakan metode yang mudah diikuti. Contoh kesalahan: public function test_course_creation_and_registration_with_invalid_data() { // Pengujian terlalu kompleks, mencakup banyak skenario $response = $this->post('/courses', [ 'title' => '', 'description' => '', ]); $response->assertStatus(422); $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 'invalid', ]); $response->assertStatus(422); $response = $this->get('/courses/1'); $response->assertStatus(404); } Perbaikan: Pisahkan pengujian ke dalam beberapa test case yang lebih spesifik: public function test_course_creation_with_invalid_data() { // Hanya menguji pembuatan kursus dengan data yang tidak valid $response = $this->post('/courses', [ 'title' => '', 'description' => '', ]); $response->assertStatus(422); } public function test_registration_with_invalid_user() { // Menguji registrasi kursus dengan user yang tidak valid $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 'invalid', ]); $response->assertStatus(422); } Dengan menghindari kesalahan-kesalahan ini, pengujian akan menjadi lebih efektif, aman, dan mudah dikelola. Pastikan setiap unit test dijalankan pada environment yang tepat dan hanya menguji satu skenario sederhana per test case. Penutup Laravel terus menjadi pilihan utama bagi para developer karena pembaruan fitur yang rutin dan memudahkan proses pengembangan aplikasi. Dengan banyaknya peningkatan dan komunitas yang aktif, framework ini akan tetap relevan dan populer di kalangan programmer. Untuk belajar lebih dalam tentang Laravel dan topik web development lainnya, pastikan untuk terus memantau website BuildWithAngga. Mereka sering menyediakan kelas gratis dengan studi kasus menarik yang dibawakan oleh mentor berpengalaman, serta memberikan akses kelas seumur hidup yang sangat bermanfaat bagi pengembangan skill Anda. Jangan lewatkan kesempatan untuk belajar dan berkembang bersama komunitas yang solid!

Kelas Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website Toko Buah Online di BuildWithAngga

Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website Toko Buah Online

Dalam pengembangan perangkat lunak, selain membuat fitur CRUD atau sistem login, programmer juga wajib menyediakan dan melakukan unit testing. Bayangkan jika kita membuat sebuah resep masakan; kita perlu mencicipi setiap bahan untuk memastikan rasa yang pas. Begitu pula dengan unit testing, yang membantu tim untuk menguji coba fitur sebelum dirilis, memastikan semuanya berfungsi dengan baik dan mengurangi kemungkinan kesalahan di masa depan. Di Laravel 11, melakukan unit testing menjadi sangat mudah. Laravel menyediakan berbagai alat dan fungsionalitas yang memungkinkan programmer untuk menulis dan menjalankan pengujian dengan cepat. Dengan bantuan framework ini, pengujian bisa dilakukan secara otomatis, sehingga pengembang dapat lebih fokus pada pengembangan fitur baru tanpa khawatir akan kesalahan yang mungkin ada. Ketika membuat website jual buah online, ada beberapa fitur unggulan yang biasanya tersedia. Pertama, halaman produk yang menampilkan berbagai jenis buah dengan deskripsi dan harga. Kedua, keranjang belanja yang memungkinkan pengguna untuk menambahkan barang sebelum melakukan checkout. Ketiga, sistem pembayaran yang aman untuk memudahkan transaksi. Keempat, pelacakan pesanan untuk memberi tahu pengguna tentang status pengiriman. Terakhir, fitur ulasan pengguna, yang memungkinkan pembeli memberikan feedback tentang produk yang mereka beli, meningkatkan kepercayaan pengguna lain. Cara Membuat Proyek Laravel 11 Baru dengan Composer dan Mengatur .env untuk Unit Testing Untuk memulai proyek Laravel 11 baru, pertama-tama pastikan Anda telah menginstal Composer di sistem Anda. Berikut adalah langkah-langkahnya: Buka terminal atau command prompt, lalu jalankan perintah berikut untuk membuat proyek baru: composer create-project laravel/laravel nama-proyek Gantilah nama-proyek dengan nama yang Anda inginkan. Setelah proses selesai, masuk ke direktori proyek: cd nama-proyek Selanjutnya, Anda perlu mengatur file .env untuk konfigurasi database yang digunakan dalam unit testing. Buka file .env di editor teks Anda dan sesuaikan pengaturan database, misalnya: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=root DB_PASSWORD=password Gantilah nilai-nilai di atas sesuai dengan konfigurasi database Anda. Untuk menjalankan unit testing, pastikan Anda sudah membuat beberapa fitur atau model yang ingin diuji. Misalnya, jika Anda memiliki model Product, buatlah pengujian untuk memastikan model tersebut berfungsi dengan baik. Jalankan perintah berikut untuk membuat pengujian: php artisan make:test ProductTest Kemudian, buka file tests/Feature/ProductTest.php dan tambahkan kode berikut untuk menguji fitur produk: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ProductTest extends TestCase { use RefreshDatabase; public function test_product_creation() { $response = $this->post('/api/products', [ 'name' => 'Apple', 'price' => 2000, ]); $response->assertStatus(201); $this->assertDatabaseHas('products', [ 'name' => 'Apple', 'price' => 2000, ]); } } Terakhir, jalankan pengujian dengan perintah berikut: php artisan test Dengan langkah-langkah di atas, Anda sudah berhasil membuat proyek Laravel 11 baru, mengatur file .env, dan melakukan unit testing pada fitur yang telah Anda buat. Cara Membuat dan Mengatur File Unit Testing untuk Fitur-Fitur di Laravel 11 Untuk melakukan unit testing pada lima fitur utama website jual buah online, pertama-tama pastikan Anda sudah memiliki struktur database dan API endpoint yang sesuai. Berikut adalah cara membuat dan mengatur file unit testing untuk masing-masing fitur dengan contoh kode lengkap. 1. Pengujian Fitur Produk Buat file test baru untuk menguji fitur produk: php artisan make:test ProductTest Buka file tests/Feature/ProductTest.php dan tambahkan kode berikut untuk menguji fitur produk, termasuk membuat dan memastikan produk tersimpan di database: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ProductTest extends TestCase { use RefreshDatabase; public function test_create_product() { $response = $this->postJson('/api/products', [ 'name' => 'Apple', 'price' => 10000, 'stock' => 50, ]); $response->assertStatus(201); $this->assertDatabaseHas('products', [ 'name' => 'Apple', 'price' => 10000, ]); } } 2. Pengujian Fitur Keranjang Belanja Buat file test baru untuk menguji fitur keranjang belanja: php artisan make:test CartTest Buka file tests/Feature/CartTest.php dan tambahkan kode berikut untuk menguji fitur menambah produk ke keranjang: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class CartTest extends TestCase { use RefreshDatabase; public function test_add_to_cart() { $product = Product::create([ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response = $this->postJson('/api/cart', [ 'product_id' => $product->id, 'quantity' => 2, ]); $response->assertStatus(200) ->assertJson([ 'added' => true, 'product_id' => $product->id, 'quantity' => 2, ]); } } 3. Pengujian Fitur Pembayaran Buat file test baru untuk menguji fitur pembayaran: php artisan make:test PaymentTest Buka file tests/Feature/PaymentTest.php dan tambahkan kode berikut untuk menguji fitur pembayaran: <?php namespace Tests\\\\Feature; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class PaymentTest extends TestCase { use RefreshDatabase; public function test_secure_payment() { $response = $this->postJson('/api/payment', [ 'amount' => 15000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200) ->assertJson([ 'payment_status' => 'success', ]); } } 4. Pengujian Fitur Pelacakan Pesanan Buat file test baru untuk menguji fitur pelacakan pesanan: php artisan make:test OrderTrackingTest Buka file tests/Feature/OrderTrackingTest.php dan tambahkan kode berikut untuk menguji fitur pelacakan pesanan: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Order; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class OrderTrackingTest extends TestCase { use RefreshDatabase; public function test_order_tracking() { $order = Order::create([ 'user_id' => 1, 'status' => 'shipped', 'total' => 25000, ]); $response = $this->getJson('/api/orders/' . $order->id); $response->assertStatus(200) ->assertJson([ 'status' => 'shipped', ]); } } 5. Pengujian Fitur Ulasan Pengguna Buat file test baru untuk menguji fitur ulasan pengguna: php artisan make:test ReviewTest Buka file tests/Feature/ReviewTest.php dan tambahkan kode berikut untuk menguji fitur ulasan pengguna: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ReviewTest extends TestCase { use RefreshDatabase; public function test_user_review() { $product = Product::create([ 'name' => 'Grapes', 'price' => 8000, 'stock' => 20, ]); $response = $this->postJson('/api/reviews', [ 'product_id' => $product->id, 'rating' => 5, 'comment' => 'Excellent quality!', ]); $response->assertStatus(201) ->assertJson([ 'reviewed' => true, 'product_id' => $product->id, ]); } } Setelah semua file pengujian selesai dibuat, jalankan perintah berikut untuk menjalankan semua pengujian: php artisan test Semua pengujian akan dijalankan, dan Anda akan melihat hasilnya di terminal. Dengan cara ini, Anda bisa memastikan bahwa setiap fitur di website toko buah online berfungsi sesuai dengan harapan. Pengertian tentang RefreshDatabase Menggunakan RefreshDatabase pada Laravel hanya akan memengaruhi database pengujian (testing) dan tidak akan menghapus atau memengaruhi data asli di server production Anda. Namun, penting untuk memahami bagaimana RefreshDatabase bekerja agar tidak terjadi kesalahpahaman. Bagaimana RefreshDatabase Bekerja? RefreshDatabase adalah trait yang digunakan pada pengujian Laravel untuk memastikan database dalam keadaan bersih setiap kali pengujian dijalankan. Trait ini akan menjalankan perintah migrate:fresh yang akan menghapus semua tabel di database dan kemudian membuat ulang tabel sesuai dengan migrasi yang ada. Penggunaan Lokal atau Pengembangan: Saat Anda menjalankan pengujian secara lokal atau di lingkungan pengembangan, RefreshDatabase akan bekerja pada database pengujian yang ditentukan di file .env.testing atau di .env jika tidak ada konfigurasi khusus untuk testing.Penggunaan di Production: Laravel tidak secara otomatis menggunakan database production untuk pengujian. Saat Anda menjalankan perintah php artisan test atau phpunit, Laravel akan menggunakan koneksi database yang ditentukan untuk lingkungan pengujian. Ini biasanya diatur di file .env.testing atau melalui konfigurasi di file phpunit.xml. Apakah Data di Production Akan Hilang? Tidak, data di server production Anda tidak akan terhapus jika: Anda tidak menjalankan perintah pengujian (php artisan test atau phpunit) di lingkungan production.Anda memastikan bahwa pengujian dilakukan dengan koneksi database yang terpisah dari database production, yang biasanya diatur dalam file .env.testing. Tips untuk Keamanan Pengujian Selalu Gunakan Koneksi Database Pengujian: Pastikan koneksi database untuk pengujian berbeda dengan koneksi database production. Anda bisa membuat database khusus untuk pengujian.Cek Konfigurasi env: Pastikan Anda menggunakan file .env.testing atau pengaturan khusus di file phpunit.xml untuk koneksi database pengujian.Jangan Jalankan php artisan test di Production: Hindari menjalankan pengujian di lingkungan production untuk menghindari risiko yang tidak perlu. Dengan mengikuti praktik-praktik di atas, Anda dapat menggunakan RefreshDatabase dengan aman tanpa khawatir data production akan terpengaruh. Kesalahan Umum dalam Melakukan Unit Testing di Laravel Unit testing adalah bagian penting dari pengembangan aplikasi, namun seringkali terdapat kesalahan yang dilakukan oleh programmer, terutama bagi yang baru memulai. Berikut adalah tiga kesalahan umum saat melakukan unit testing di Laravel beserta contoh kode yang relevan. Menggunakan Database Production untuk Pengujian Salah satu kesalahan terbesar adalah menggunakan database production untuk menjalankan pengujian. Ini sangat berbahaya karena dapat menghapus atau memodifikasi data yang sebenarnya digunakan dalam aplikasi. Misalnya, jika menggunakan RefreshDatabase tanpa memastikan bahwa koneksi database sudah diset untuk pengujian, semua data di database production bisa terhapus. Contoh kode yang salah: use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ProductTest extends TestCase { use RefreshDatabase; public function test_create_product() { // Jika koneksi menggunakan database production, ini akan menghapus semua data. $response = $this->post('/api/products', [ 'name' => 'Apple', 'price' => 10000, 'stock' => 50, ]); $response->assertStatus(201); } } Pastikan untuk menggunakan database khusus pengujian dengan menambahkan konfigurasi di file .env.testing seperti: DB_CONNECTION=mysql_testing DB_DATABASE=testing_database Tidak Menggunakan Mocking untuk Layanan Eksternal Ketika melakukan unit testing, penting untuk memisahkan pengujian dari dependensi luar, seperti API eksternal atau layanan pembayaran. Menghubungkan langsung ke layanan eksternal saat pengujian tidak hanya memperlambat proses, tetapi juga dapat menyebabkan hasil yang tidak konsisten. Contoh kode yang salah: class PaymentTest extends TestCase { public function test_payment_process() { // Memanggil layanan pembayaran eksternal secara langsung. $response = $this->post('/api/payment', [ 'amount' => 15000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200); } } Untuk mengatasi ini, gunakan mocking atau fake service agar pengujian tetap cepat dan terisolasi: class PaymentTest extends TestCase { public function test_payment_process() { // Menggunakan mock untuk layanan pembayaran. $this->mock(PaymentService::class, function ($mock) { $mock->shouldReceive('process') ->andReturn(['status' => 'success']); }); $response = $this->post('/api/payment', [ 'amount' => 15000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200) ->assertJson(['status' => 'success']); } } Menulis Pengujian Terlalu Kompleks atau Tidak Fokus Pengujian unit seharusnya hanya menguji satu fungsi atau bagian kecil dari kode. Kesalahan yang umum adalah menulis pengujian yang terlalu kompleks, yang menguji beberapa fitur sekaligus, sehingga sulit menemukan penyebab kesalahan jika pengujian gagal. Contoh kode yang salah: class ComplexFeatureTest extends TestCase { public function test_complex_feature() { // Menguji terlalu banyak hal dalam satu pengujian. $response = $this->post('/api/products', [ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response->assertStatus(201); $response = $this->post('/api/cart', [ 'product_id' => 1, 'quantity' => 2, ]); $response->assertStatus(200); $response = $this->post('/api/payment', [ 'amount' => 10000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200); } } Untuk pengujian yang lebih baik, pisahkan pengujian menjadi beberapa bagian yang lebih kecil dan terfokus: class ProductTest extends TestCase { public function test_create_product() { $response = $this->post('/api/products', [ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response->assertStatus(201); } } class CartTest extends TestCase { public function test_add_to_cart() { $product = Product::create([ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response = $this->post('/api/cart', [ 'product_id' => $product->id, 'quantity' => 2, ]); $response->assertStatus(200); } } Penutup dan saran mentor Laravel terus berkembang dan menjadi salah satu framework PHP yang paling populer berkat update fitur-fitur menarik yang memudahkan developer dalam mengembangkan aplikasi web dengan cepat dan efisien. Dengan komunitas yang besar dan dokumentasi yang lengkap, Laravel memberikan dukungan yang kuat bagi para programmer di seluruh dunia. Untuk terus mengasah kemampuan Anda dalam menggunakan Laravel, pastikan untuk selalu memantau BuildWithAngga. Mereka sering mengupdate kelas-kelas gratis dengan studi kasus yang menarik dan dipandu oleh mentor berpengalaman. Selain itu, Anda juga akan mendapatkan akses seumur hidup untuk setiap kelas yang diikuti, sehingga Anda bisa belajar kapan saja tanpa batasan waktu. Terus belajar dan kembangkan keterampilan Anda bersama BuildWithAngga!

Kelas Tutorial Task Schedule Laravel 11 Pada Projek Website Sewa Kantor di BuildWithAngga

Tutorial Task Schedule Laravel 11 Pada Projek Website Sewa Kantor

Dalam membangun sebuah website sewa kantor, tujuan utama kita adalah memberikan pengalaman terbaik bagi pengguna. Bayangkan, seorang pengunjung datang ke website kita untuk mencari kantor yang ideal. Jika informasi yang mereka butuhkan sulit diakses atau tampilan website kita tidak menarik, besar kemungkinan mereka akan meninggalkan website tanpa melakukan tindakan apa pun. Pengalaman pengguna yang baik bisa diibaratkan seperti pelayan ramah di sebuah restoran, yang tahu kapan harus memberikan menu, kapan mengisi ulang minuman, dan kapan menawarkan bantuan. Semuanya dilakukan dengan tepat waktu dan tanpa membuat pelanggan merasa terganggu. Untuk mencapai hal ini, kita perlu memastikan bahwa website berjalan dengan lancar, informasi selalu up-to-date, dan berbagai fitur otomatis bekerja sesuai jadwal. Di sinilah fitur task schedule pada Laravel 11 bisa sangat membantu. Fitur Task Schedule Laravel untuk Otomatisasi Website Laravel adalah framework PHP yang populer di kalangan developer karena banyaknya fitur canggih yang ditawarkan, salah satunya adalah task scheduling. Fitur ini memungkinkan kita untuk mengatur tugas-tugas tertentu agar berjalan secara otomatis pada waktu yang sudah ditentukan. Misalnya, mengirim email pengingat kepada calon penyewa yang belum menyelesaikan proses booking, membersihkan data lama dari database, atau melakukan backup data secara rutin. Analoginya, fitur task schedule ini seperti alarm pada smartphone kita. Bayangkan, kita punya alarm yang disetel untuk berbagai keperluan: bangun pagi, mengingatkan makan siang, dan meeting sore. Semua dilakukan secara otomatis sesuai waktu yang sudah ditentukan. Demikian juga, task schedule di Laravel bisa diatur untuk menjalankan tugas-tugas rutin tanpa kita harus melakukannya secara manual setiap saat. Fitur ini sangat berguna untuk website sewa kantor karena kita dapat: Mengirimkan notifikasi harian kepada penyewa mengenai tagihan yang akan jatuh tempo.Memperbarui status ketersediaan kantor secara otomatis setiap malam berdasarkan data terbaru.Mengirim laporan harian kepada admin mengenai jumlah penyewa baru, permintaan kunjungan, dan sebagainya. Dengan adanya task schedule, kita bisa fokus pada pengembangan fitur lain tanpa khawatir tentang tugas-tugas rutin yang harus dijalankan. Cara Menggunakan Task Schedule di Laravel Untuk menggunakan task scheduling di Laravel, pertama-tama kita harus mengkonfigurasi Laravel Cron Job di server. Setelah itu, kita bisa mendefinisikan tugas-tugas apa saja yang ingin dijalankan secara otomatis di file app/Console/Kernel.php. Berikut ini adalah contoh sederhana penggunaan task schedule: protected function schedule(Schedule $schedule) { // Mengirim email pengingat setiap hari pada pukul 08:00 pagi $schedule->call(function () { // Logika pengiriman email di sini })->dailyAt('08:00'); } Untuk lebih mendalami cara menggunakan fitur ini, kamu bisa membaca dokumentasi resmi Laravel tentang Task Scheduling. Dengan fitur ini, kita bisa memastikan bahwa tugas-tugas yang bersifat rutin dan berulang dapat dijalankan secara otomatis, sehingga pengguna mendapatkan pengalaman yang lebih baik dan pengelolaan website menjadi lebih efisien. Cara Membuat Projek Website Sewa Kantor dengan Laravel 11 Menggunakan Composer Untuk memulai proyek website sewa kantor dengan Laravel 11, langkah pertama yang perlu dilakukan adalah memastikan bahwa Composer sudah terinstall di sistem. Composer adalah alat yang digunakan untuk mengelola dependensi PHP dan merupakan cara termudah untuk menginstall Laravel. Langkah pertama, buka terminal atau command prompt, lalu jalankan perintah berikut untuk membuat proyek Laravel baru: composer create-project --prefer-dist laravel/laravel sewa-kantor Perintah di atas akan mengunduh Laravel 11 beserta semua dependensi yang diperlukan ke dalam folder sewa-kantor. Setelah proses instalasi selesai, masuk ke direktori proyek dengan perintah berikut: cd sewa-kantor Selanjutnya, buat database baru di MySQL atau PostgreSQL dan sesuaikan pengaturan koneksi database di file .env yang ada di root proyek Laravel. Misalnya, sesuaikan bagian ini: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=sewa_kantor_db DB_USERNAME=root DB_PASSWORD=your_password Setelah itu, jalankan perintah migrasi untuk membuat tabel-tabel yang diperlukan oleh Laravel: php artisan migrate Perintah ini akan membuat tabel-tabel dasar seperti users, password_resets, dan failed_jobs di database sewa_kantor_db. Agar proyek bisa dijalankan secara lokal, gunakan perintah berikut untuk menjalankan server Laravel: php artisan serve Server Laravel sekarang berjalan di http://127.0.0.1:8000. Akses URL tersebut di browser untuk melihat tampilan awal proyek Laravel yang baru saja dibuat. Dengan langkah-langkah di atas, proyek website sewa kantor berbasis Laravel 11 sudah siap digunakan sebagai basis pengembangan fitur-fitur lebih lanjut, seperti task scheduling untuk pengelolaan otomatis berbagai tugas rutin. Cara Membuat File Model dan Migration untuk Tabel-Tabel yang Dibutuhkan Untuk membangun fitur-fitur unggulan pada website sewa kantor dengan Laravel, kita memerlukan beberapa tabel penting seperti offices untuk data kantor, bookings untuk data penyewaan, users untuk data penyewa, payments untuk catatan pembayaran, dan activities untuk mencatat aktivitas pengguna. Berikut adalah langkah-langkah membuat model dan migration untuk tabel-tabel tersebut. Pertama, pastikan berada di dalam direktori proyek Laravel yang telah dibuat sebelumnya. Kemudian, gunakan perintah Artisan untuk membuat model dan migration. php artisan make:model Office -m php artisan make:model Booking -m php artisan make:model User -m php artisan make:model Payment -m php artisan make:model Activity -m Perintah di atas akan membuat file model dan migration untuk masing-masing entitas yang diperlukan. Selanjutnya, kita akan mengedit file migration yang terletak di direktori database/migrations. Tabel Offices Untuk tabel offices, tambahkan kolom-kolom yang diperlukan seperti name, location, price, dan availability. Berikut contoh kodingnya: public function up() { Schema::create('offices', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('location'); $table->decimal('price', 10, 2); $table->boolean('availability')->default(true); $table->timestamps(); }); } Tabel Bookings Untuk tabel bookings, tambahkan kolom yang menyimpan informasi tentang penyewa, kantor yang disewa, tanggal mulai, dan tanggal selesai penyewaan. public function up() { Schema::create('bookings', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained('users'); $table->foreignId('office_id')->constrained('offices'); $table->date('start_date'); $table->date('end_date'); $table->timestamps(); }); } Tabel Users Untuk tabel users, Laravel sudah menyediakan migration default. Pastikan tabel ini memiliki kolom-kolom yang diperlukan seperti name, email, dan password. Jika ingin menambahkan kolom lain, edit migration default yang sudah ada. public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } Tabel Payments Untuk tabel payments, tambahkan kolom untuk menyimpan informasi pembayaran seperti booking_id, amount, status, dan payment_date. public function up() { Schema::create('payments', function (Blueprint $table) { $table->id(); $table->foreignId('booking_id')->constrained('bookings'); $table->decimal('amount', 10, 2); $table->string('status'); $table->date('payment_date'); $table->timestamps(); }); } Tabel Activities Tabel activities digunakan untuk mencatat semua aktivitas pengguna di website seperti login, booking, dan pembayaran. public function up() { Schema::create('activities', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained('users'); $table->string('description'); $table->timestamps(); }); } Setelah semua file migration sudah diisi dengan skema tabel yang sesuai, jalankan perintah berikut untuk membuat tabel-tabel tersebut di database: php artisan migrate Dengan demikian, semua tabel yang dibutuhkan untuk fitur-fitur unggulan pada website sewa kantor sudah tersedia di database dan siap digunakan untuk proses pengembangan lebih lanjut. Cara Menerapkan 5 Fitur Utama dengan Task Scheduling Laravel 11 Task scheduling di Laravel 11 memungkinkan kita untuk mengotomatisasi berbagai tugas rutin yang diperlukan untuk menjalankan fitur-fitur utama pada website sewa kantor. Berikut adalah cara menerapkan masing-masing fitur dengan menggunakan task scheduling beserta contoh kodingnya. Pengingat Pembayaran Otomatis Untuk mengingatkan pengguna tentang pembayaran yang akan datang, kita dapat membuat task schedule yang akan mengirimkan email pengingat beberapa hari sebelum tanggal jatuh tempo. Buatlah sebuah command baru untuk mengirim email pengingat: php artisan make:command SendPaymentReminder Kemudian, tambahkan logika pengiriman email di dalam file SendPaymentReminder.php: public function handle() { $bookings = Booking::where('end_date', '>=', now()->subDays(3)) ->where('end_date', '<', now()) ->whereDoesntHave('payments') ->get(); foreach ($bookings as $booking) { Mail::to($booking->user->email)->send(new PaymentReminderMail($booking)); } } Jadwalkan command ini di app/Console/Kernel.php: protected function schedule(Schedule $schedule) { $schedule->command('send:payment-reminder')->daily(); } Pembaruan Ketersediaan Kantor Untuk memperbarui status ketersediaan kantor secara otomatis, buatlah command baru: php artisan make:command UpdateOfficeAvailability Di dalam UpdateOfficeAvailability.php, tambahkan logika untuk memperbarui ketersediaan kantor: public function handle() { $offices = Office::all(); foreach ($offices as $office) { $office->availability = $office->bookings()->where('end_date', '>', now())->count() === 0; $office->save(); } } Jadwalkan command ini agar berjalan setiap malam: protected function schedule(Schedule $schedule) { $schedule->command('update:office-availability')->dailyAt('23:00'); } Laporan Aktivitas Harian Untuk mengirim laporan aktivitas harian kepada admin, buat command baru: php artisan make:command SendDailyActivityReport Tambahkan logika untuk mengirim laporan harian melalui email: public function handle() { $activities = Activity::whereDate('created_at', now()->format('Y-m-d'))->get(); Mail::to('[email protected]')->send(new DailyActivityReportMail($activities)); } Jadwalkan command ini agar berjalan setiap pagi: protected function schedule(Schedule $schedule) { $schedule->command('send:daily-activity-report')->dailyAt('08:00'); } Pengarsipan Data Lama Untuk mengarsipkan data lama, buat command baru: php artisan make:command ArchiveOldBookings Tambahkan logika untuk mengarsipkan data booking lama: public function handle() { $oldBookings = Booking::where('end_date', '<', now()->subYear())->get(); foreach ($oldBookings as $booking) { // Logika pengarsipan, misalnya memindahkan data ke tabel arsip ArchivedBooking::create($booking->toArray()); $booking->delete(); } } Jadwalkan command ini agar berjalan setiap bulan: protected function schedule(Schedule $schedule) { $schedule->command('archive:old-bookings')->monthly(); } Backup Data Rutin Untuk membuat backup data rutin, buat command baru: php artisan make:command BackupDatabase Tambahkan logika untuk melakukan backup database: public function handle() { $filename = "backup-" . now()->format('Y-m-d-H-i-s') . ".sql"; $command = "mysqldump -u root -p'password' sewa_kantor_db > " . storage_path("backups/" . $filename); exec($command); } Jadwalkan command ini agar berjalan setiap malam: protected function schedule(Schedule $schedule) { $schedule->command('backup:database')->dailyAt('02:00'); } Dengan menerapkan task scheduling seperti contoh di atas, kita dapat memastikan bahwa fitur-fitur penting pada website sewa kantor berjalan secara otomatis dan teratur. Ini membantu menjaga pengalaman pengguna yang baik dan mengurangi beban pekerjaan manual. Penutup Laravel akan terus menjadi pilihan utama bagi developer karena selalu menghadirkan update menarik yang memudahkan proses pengembangan web. Fitur-fitur canggih seperti task scheduling tidak hanya meningkatkan efisiensi kerja tetapi juga membuka peluang inovasi dalam proyek yang kita kerjakan. Untuk terus meningkatkan kemampuan dan mengikuti perkembangan terbaru, pantau terus website Buildwithangga. Mereka sering mengupdate kelas gratis dengan studi kasus menarik bersama mentor berpengalaman, serta menawarkan akses kelas seumur hidup. Dengan belajar secara kontinu, kita dapat menjadi developer yang lebih kompeten dan siap menghadapi tantangan di dunia teknologi.

Kelas Tutorial Laravel 11, Filament, Spatie, Midtrans Bikin Website Toko Online Sederhana di BuildWithAngga

Tutorial Laravel 11, Filament, Spatie, Midtrans Bikin Website Toko Online Sederhana

Membangun sebuah website e-commerce bukan hanya tentang bagaimana menampilkan produk dan transaksi pembelian di sisi pengguna (frontend). Sebuah website e-commerce yang baik juga harus memiliki halaman admin yang terstruktur dan efisien untuk memudahkan pengelolaan produk, pesanan, pelanggan, dan laporan penjualan. Dalam artikel ini, kita akan membahas bagaimana cara membuat halaman admin beserta Content Management System (CMS) menggunakan Laravel dan Filament. Pentingnya Halaman Admin yang Terstruktur Bayangkan Anda memiliki sebuah toko fisik dengan berbagai produk yang dijual. Tanpa sistem manajemen yang baik, Anda akan kesulitan melacak stok barang, pesanan yang masuk, atau bahkan detail pelanggan. Hal ini sama pentingnya dengan toko online. Halaman admin yang terstruktur ibarat sebuah kantor pusat yang mengelola segala aktivitas di toko tersebut. Melalui halaman ini, kita bisa melakukan hal-hal seperti: Mengelola Produk: Menambahkan, mengubah, atau menghapus produk dengan mudah.Mengelola Pesanan: Melihat detail pesanan yang masuk, status pengiriman, hingga riwayat transaksi.Mengelola Pelanggan: Melihat data pelanggan, riwayat pembelian, dan preferensi mereka.Laporan Penjualan: Melihat data penjualan harian, mingguan, hingga bulanan untuk analisis lebih lanjut. Dengan halaman admin yang baik, seluruh proses pengelolaan ini bisa dilakukan dengan lebih efisien dan terstruktur. Itulah mengapa penting untuk membangun sistem admin yang user-friendly dan dapat diandalkan. Laravel dan Filament: Kombinasi yang Tepat untuk Membangun CMS Laravel adalah framework PHP yang sangat populer di kalangan developer web. Framework ini menyediakan berbagai fitur yang membuat pengembangan website menjadi lebih mudah dan aman. Beberapa fitur penting dari Laravel yang relevan untuk membangun sistem admin adalah: Eloquent ORM: Membuat interaksi dengan database menjadi lebih sederhana dan mudah dipahami. Anda bisa menggunakan Eloquent untuk membuat, membaca, mengubah, dan menghapus data di database dengan sintaks yang mudah dipahami.Middleware: Digunakan untuk memfilter dan memeriksa permintaan HTTP sebelum mencapai aplikasi. Ini sangat berguna untuk mengamankan halaman admin dengan memeriksa apakah pengguna sudah login dan memiliki akses yang tepat.Policy: Memberikan kontrol akses yang lebih rinci untuk setiap tindakan yang dilakukan di aplikasi. Misalnya, hanya pengguna dengan peran 'Admin' yang bisa menambahkan produk baru. Sementara itu, Filament adalah library yang mempermudah pembuatan dashboard dan halaman admin di Laravel. Filament dilengkapi dengan resource builder yang intuitif, sehingga Anda bisa membuat form, tabel, dan antarmuka admin lainnya dengan cepat tanpa perlu menulis kode dari nol. Berikut beberapa keunggulan Filament: Resource Builder: Dengan fitur ini, Anda bisa membuat halaman admin untuk mengelola data seperti produk, pesanan, atau pelanggan hanya dengan beberapa konfigurasi sederhana.Modular: Filament dirancang secara modular, artinya Anda bisa menambahkan fitur atau modul baru ke dalam dashboard admin Anda dengan mudah.User Interface (UI) yang Intuitif: Filament memberikan UI yang user-friendly dan modern, sehingga mudah digunakan bahkan untuk pengguna yang baru mengenal sistem admin. Mengapa Laravel dan Filament Cocok untuk E-Commerce? Keamanan: Laravel dilengkapi dengan fitur seperti CSRF protection, validasi input, dan manajemen sesi yang membantu menjaga keamanan aplikasi e-commerce Anda. Dengan Filament, Anda juga bisa menambahkan level akses yang lebih rinci pada halaman admin.Kecepatan Pengembangan: Kombinasi Laravel dan Filament memungkinkan pengembangan halaman admin menjadi lebih cepat. Anda tidak perlu membangun dashboard dari nol, cukup gunakan resource builder dari Filament.Kemudahan Maintenance: Dengan struktur MVC (Model-View-Controller) dari Laravel, Anda bisa memisahkan logika bisnis, tampilan, dan data dengan jelas. Filament membantu memisahkan logika tampilan di halaman admin, sehingga lebih mudah dimaintenance. Membuat Projek Laravel Terbaru Menggunakan Composer dan Mengatur Koneksi MySQL Untuk memulai projek Laravel terbaru, kita dapat menggunakan Composer untuk menginstall Laravel beserta dependensinya. Pada langkah-langkah berikut, kita akan belajar cara membuat projek Laravel terbaru menggunakan Composer dan mengatur koneksi MySQL pada file .env. 1. Membuat Projek Laravel dengan Composer Langkah pertama adalah membuat projek Laravel menggunakan perintah composer create-project. Pastikan Composer sudah terinstall di komputer Anda. Jika belum, silakan download dan install Composer dari situs resmi Composer. Buka terminal atau command prompt, lalu jalankan perintah berikut: composer create-project --prefer-dist laravel/laravel nama_projek Gantilah nama_projek dengan nama projek yang ingin Anda buat. Perintah ini akan mengunduh dan menginstall Laravel beserta dependensi yang diperlukan di folder nama_projek. 2. Mengatur Koneksi Database di File .env Setelah proses instalasi selesai, masuk ke folder projek yang baru dibuat: cd nama_projek Di dalam folder projek tersebut, terdapat file .env yang berfungsi untuk menyimpan konfigurasi environment, termasuk pengaturan koneksi database. Berikut adalah cara mengatur koneksi MySQL di file .env: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=root DB_PASSWORD=kata_sandi DB_CONNECTION: Menentukan jenis database yang digunakan. Dalam contoh ini, kita menggunakan mysql.DB_HOST: Alamat host database. Jika MySQL terinstall secara lokal, gunakan 127.0.0.1.DB_PORT: Port yang digunakan untuk koneksi ke MySQL. Secara default, MySQL menggunakan port 3306.DB_DATABASE: Nama database yang akan digunakan untuk projek Laravel ini. Pastikan database ini sudah dibuat di MySQL.DB_USERNAME: Username yang digunakan untuk mengakses database MySQL.DB_PASSWORD: Password yang digunakan untuk mengakses database MySQL. Contoh pengaturan .env untuk koneksi ke database MySQL lokal: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_ecommerce DB_USERNAME=root DB_PASSWORD=password123 Pastikan untuk mengganti DB_DATABASE, DB_USERNAME, dan DB_PASSWORD sesuai dengan pengaturan di MySQL Anda. 3. Menguji Koneksi Database Setelah melakukan pengaturan di file .env, langkah selanjutnya adalah menguji koneksi ke database dengan menjalankan migrasi default dari Laravel. Jalankan perintah berikut di terminal: php artisan migrate Jika tidak ada error, berarti koneksi ke database berhasil dan tabel-tabel default Laravel berhasil dibuat. Jika terdapat error, periksa kembali pengaturan di file .env dan pastikan database MySQL Anda sudah berjalan. 4. Contoh Kode Lengkap Berikut adalah contoh file .env lengkap setelah pengaturan koneksi database: APP_NAME=Laravel APP_ENV=local APP_KEY=base64:....... APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_ecommerce DB_USERNAME=root DB_PASSWORD=password123 BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="[email protected]" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" Dalam contoh ini, konfigurasi yang perlu diperhatikan adalah bagian DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, dan DB_PASSWORD. Pastikan nilai-nilai ini sesuai dengan pengaturan MySQL Anda. Membuat File Migration dan Model untuk Tabel E-Commerce di Laravel Dalam sebuah proyek e-commerce, kita memerlukan beberapa tabel seperti products, categories, customers, dan orders. Setiap tabel ini akan saling berhubungan melalui relasi Eloquent seperti hasMany, belongsTo, dan belongsToMany. Langkah-langkah berikut akan menjelaskan cara membuat file migration dan model untuk setiap tabel, menambahkan properti fillable, serta mengatur hubungan antar tabel menggunakan Artisan command dan metode Eloquent. Membuat Migration untuk Tabel E-Commerce Untuk membuat file migration, gunakan perintah Artisan make:migration yang akan membuat file migration baru di dalam folder database/migrations. Tabel Categories Mulai dengan membuat tabel categories untuk menyimpan informasi kategori produk: php artisan make:migration create_categories_table --create=categories Isi file migration create_categories_table: Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name')->unique(); // Nama kategori unik $table->timestamps(); }); Tabel Products Lanjutkan dengan membuat tabel products untuk menyimpan data produk: php artisan make:migration create_products_table --create=products Isi file migration create_products_table: Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); // Nama produk $table->text('description')->nullable(); // Deskripsi produk, bisa null $table->decimal('price', 8, 2); // Harga produk $table->integer('stock'); // Stok produk $table->foreignId('category_id')->constrained()->onDelete('cascade'); // Relasi ke tabel categories $table->timestamps(); }); Tabel Customers Selanjutnya, buat tabel customers untuk menyimpan data pelanggan: php artisan make:migration create_customers_table --create=customers Isi file migration create_customers_table: Schema::create('customers', function (Blueprint $table) { $table->id(); $table->string('name'); // Nama pelanggan $table->string('email')->unique(); // Email pelanggan unik $table->string('phone'); // Nomor telepon pelanggan $table->text('address'); // Alamat pelanggan $table->timestamps(); }); Tabel Orders Terakhir, buat tabel orders untuk menyimpan data pesanan: php artisan make:migration create_orders_table --create=orders Isi file migration create_orders_table: Schema::create('orders', function (Blueprint $table) { $table->id(); $table->foreignId('customer_id')->constrained()->onDelete('cascade'); // Relasi ke tabel customers $table->decimal('total_price', 10, 2); // Total harga pesanan $table->string('status')->default('pending'); // Status pesanan, default 'pending' $table->timestamps(); }); Jalankan semua migration yang telah dibuat dengan perintah: php artisan migrate Membuat Model dan Menambahkan Properti Fillable Setelah membuat migration, kita perlu membuat model untuk setiap tabel. Tambahkan properti fillable pada setiap model untuk mengatur atribut apa saja yang bisa diisi secara massal. Model Category Buat model untuk tabel categories: php artisan make:model Category Isi file model Category.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Category extends Model { use HasFactory; protected $fillable = [ 'name', // Atribut yang bisa diisi secara massal ]; public function products() { return $this->hasMany(Product::class); // Satu kategori memiliki banyak produk } } Model Product Buat model untuk tabel products: php artisan make:model Product Isi file model Product.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Product extends Model { use HasFactory; protected $fillable = [ 'name', 'description', 'price', 'stock', 'category_id' ]; public function category() { return $this->belongsTo(Category::class); // Produk ini milik satu kategori } public function orders() { return $this->belongsToMany(Order::class, 'order_product')->withPivot('quantity'); // Produk bisa ada di banyak pesanan } } Model Customer Buat model untuk tabel customers: php artisan make:model Customer Isi file model Customer.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Customer extends Model { use HasFactory; protected $fillable = [ 'name', 'email', 'phone', 'address' ]; public function orders() { return $this->hasMany(Order::class); // Pelanggan bisa memiliki banyak pesanan } } Model Order Buat model untuk tabel orders: php artisan make:model Order Isi file model Order.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Order extends Model { use HasFactory; protected $fillable = [ 'customer_id', 'total_price', 'status' ]; public function customer() { return $this->belongsTo(Customer::class); // Pesanan ini milik satu pelanggan } public function products() { return $this->belongsToMany(Product::class, 'order_product')->withPivot('quantity'); // Pesanan bisa memiliki banyak produk } } Mengatur Relasi Antar Tabel Berikut adalah penjelasan tentang bagaimana mengatur relasi antar tabel menggunakan Eloquent: Category memiliki relasi hasMany ke Product, artinya satu kategori dapat memiliki banyak produk.Product memiliki relasi belongsTo ke Category, artinya setiap produk hanya dimiliki oleh satu kategori.Customer memiliki relasi hasMany ke Order, artinya satu pelanggan dapat membuat banyak pesanan.Order memiliki relasi belongsTo ke Customer, artinya setiap pesanan hanya dimiliki oleh satu pelanggan.Product dan Order memiliki relasi belongsToMany melalui tabel pivot order_product, artinya satu produk bisa ada di banyak pesanan, dan satu pesanan bisa memiliki banyak produk. Cara Menginstall Package Filament dan Membuat Akun Admin Filament adalah paket Laravel yang memudahkan pembuatan dashboard dan Content Management System (CMS) dengan antarmuka yang modern dan fitur-fitur yang lengkap. Berikut adalah langkah-langkah untuk menginstall Filament, membuat akun admin, serta mengonfigurasi user sebagai admin. Menginstall Package Filament Mulailah dengan menginstall package Filament menggunakan Composer. Buka terminal atau command prompt di direktori proyek Laravel Anda, kemudian jalankan perintah berikut: composer require filament/filament Perintah ini akan mengunduh dan menginstal package Filament beserta semua dependensi yang diperlukan ke dalam proyek Laravel Anda. Menjalankan Migrasi Setelah menginstall Filament, Anda perlu menjalankan migrasi untuk membuat tabel yang diperlukan oleh Filament. Tabel ini digunakan untuk menyimpan data user dan manajemen dashboard. php artisan migrate Perintah ini akan membuat tabel-tabel yang dibutuhkan Filament, seperti users, password_resets, dan lainnya di dalam database. Membuat Akun Admin dengan Filament Filament menyediakan perintah khusus untuk membuat akun admin secara cepat. Gunakan perintah berikut untuk membuat user baru yang akan digunakan sebagai admin: php artisan make:filament-user Perintah ini akan meminta Anda untuk memasukkan informasi berikut: Nama user (misalnya Admin User)Alamat email (misalnya [email protected])Kata sandiOpsi untuk menetapkan user sebagai super admin (ketik yes untuk memberikan akses penuh kepada user ini) Berikut contoh tampilan interaktif di terminal: Name: Admin User Email: [email protected] Password: Super Admin: yes Jika Anda memilih yes untuk super admin, user ini akan memiliki semua izin yang tersedia di dashboard Filament. Konfigurasi Akun Admin Setelah membuat akun admin, Anda perlu mengatur middleware agar user ini dapat mengakses dashboard Filament. Secara default, Filament menggunakan middleware filament untuk memverifikasi apakah user memiliki izin untuk mengakses dashboard. Pastikan middleware ini sudah dikonfigurasi dengan benar. Berikut adalah langkah-langkah yang perlu dilakukan untuk mengonfigurasi user sebagai admin: Buka file config/filament.php di proyek Laravel Anda.Temukan bagian auth.guard dan pastikan guard yang digunakan adalah web: 'auth' => [ 'guard' => 'web', ],Temukan bagian auth.providers.users.model dan pastikan model yang digunakan adalah App\\\\Models\\\\User atau model user yang Anda gunakan: 'auth' => [ 'providers' => [ 'users' => [ 'model' => App\\\\Models\\\\User::class, ], ], ], Pastikan juga bahwa user yang Anda buat memiliki akses ke dashboard Filament. Jika Anda menggunakan Role dan Permission, pastikan bahwa user tersebut memiliki role admin atau izin yang sesuai untuk mengakses halaman dashboard. Mengakses Dashboard Filament Setelah melakukan konfigurasi, Anda dapat mengakses dashboard Filament melalui URL berikut: <http://localhost/admin> Masukkan email dan password yang telah Anda buat menggunakan perintah make:filament-user. Jika login berhasil, Anda akan masuk ke dashboard Filament yang berisi antarmuka untuk mengelola data. Membuat Resource untuk CRUD di Filament Untuk mengelola data dari tabel-tabel yang telah dibuat seperti products, categories, customers, dan orders, kita bisa menggunakan fitur resource dari Filament. Filament memudahkan pembuatan halaman CRUD (Create, Read, Update, Delete) melalui dashboard admin dengan menggunakan command php artisan make:filament-resource. Berikut ini adalah langkah-langkah lengkap untuk membuat resource pada setiap tabel beserta contoh kode konfigurasi fields, forms, dan tables. Membuat Resource untuk Setiap Tabel Setiap resource akan merepresentasikan satu tabel di dalam aplikasi e-commerce kita. Gunakan perintah php artisan make:filament-resource untuk membuat resource ini. Membuat Resource untuk Tabel Categories php artisan make:filament-resource Category Resource ini akan menghasilkan beberapa file utama, termasuk file CategoryResource.php yang mengatur bagaimana resource ini ditampilkan di dashboard admin. Isi file app/Filament/Resources/CategoryResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CategoryResource\\\\Pages; use App\\\\Models\\\\Category; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class CategoryResource extends Resource { protected static ?string $model = Category::class; protected static ?string $navigationIcon = 'heroicon-o-tag'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListCategories::route('/'), 'create' => Pages\\\\CreateCategory::route('/create'), 'edit' => Pages\\\\EditCategory::route('/{record}/edit'), ]; } } Membuat Resource untuk Tabel Products php artisan make:filament-resource Product Isi file app/Filament/Resources/ProductResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\ProductResource\\\\Pages; use App\\\\Models\\\\Product; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class ProductResource extends Resource { protected static ?string $model = Product::class; protected static ?string $navigationIcon = 'heroicon-o-shopping-bag'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), Forms\\\\Components\\\\Textarea::make('description') ->maxLength(65535), Forms\\\\Components\\\\TextInput::make('price') ->numeric() ->required(), Forms\\\\Components\\\\TextInput::make('stock') ->numeric() ->required(), Forms\\\\Components\\\\Select::make('category_id') ->relationship('category', 'name') ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('stock')->sortable(), Tables\\\\Columns\\\\TextColumn::make('category.name')->label('Category'), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListProducts::route('/'), 'create' => Pages\\\\CreateProduct::route('/create'), 'edit' => Pages\\\\EditProduct::route('/{record}/edit'), ]; } } Membuat Resource untuk Tabel Customers php artisan make:filament-resource Customer Isi file app/Filament/Resources/CustomerResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CustomerResource\\\\Pages; use App\\\\Models\\\\Customer; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class CustomerResource extends Resource { protected static ?string $model = Customer::class; protected static ?string $navigationIcon = 'heroicon-o-user-group'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), Forms\\\\Components\\\\TextInput::make('email') ->email() ->required() ->maxLength(255), Forms\\\\Components\\\\TextInput::make('phone') ->tel() ->maxLength(20) ->required(), Forms\\\\Components\\\\Textarea::make('address') ->maxLength(65535) ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('email')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('phone')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListCustomers::route('/'), 'create' => Pages\\\\CreateCustomer::route('/create'), 'edit' => Pages\\\\EditCustomer::route('/{record}/edit'), ]; } } Membuat Resource untuk Tabel Orders php artisan make:filament-resource Order Isi file app/Filament/Resources/OrderResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\OrderResource\\\\Pages; use App\\\\Models\\\\Order; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class OrderResource extends Resource { protected static ?string $model = Order::class; protected static ?string $navigationIcon = 'heroicon-o-shopping-cart'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\Select::make('customer_id') ->relationship('customer', 'name') ->required(), Forms\\\\Components\\\\TextInput::make('total_price') ->numeric() ->required(), Forms\\\\Components\\\\Select::make('status') ->options([ 'pending' => 'Pending', 'completed' => 'Completed', 'cancelled' => 'Cancelled', ]) ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('customer.name')->label('Customer')->sortable(), Tables\\\\Columns\\\\TextColumn::make('total_price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('status')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListOrders::route('/'), 'create' => Pages\\\\CreateOrder::route('/create'), 'edit' => Pages\\\\EditOrder::route('/{record}/edit'), ]; } } Mengatur Fields, Forms, dan Tables untuk Setiap Resource Fields: Digunakan untuk mendefinisikan form input yang akan digunakan ketika menambahkan atau mengedit data. Contohnya adalah Forms\\\\Components\\\\TextInput::make('name') untuk field name. Forms: Berfungsi untuk mendefinisikan form schema yang ditampilkan pada halaman create dan edit. Contohnya: Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255) Tables: Digunakan untuk mendefinisikan kolom yang akan ditampilkan pada tabel daftar data. Contohnya: Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable() Setiap resource memiliki form dan table yang dikonfigurasikan sesuai kebutuhan untuk mengel ola data dari tabel yang bersangkutan di halaman admin. Menambahkan Fitur Authentication Menggunakan Laravel Breeze atau Fortify Laravel Breeze dan Fortify adalah solusi bawaan Laravel untuk menambahkan fitur autentikasi seperti login, register, dan manajemen pengguna. Keduanya menawarkan cara yang efisien untuk mengamankan akses ke halaman admin. Berikut adalah langkah-langkah instalasi, konfigurasi, serta penambahan login dan register form untuk memastikan hanya pengguna yang memiliki izin yang dapat mengakses halaman admin. Menggunakan Laravel Breeze Instalasi Laravel Breeze Laravel Breeze menyediakan implementasi autentikasi yang sederhana dan cepat. Untuk menginstal Laravel Breeze, pertama-tama pastikan Anda berada di direktori proyek Laravel, lalu jalankan perintah berikut: composer require laravel/breeze --dev Setelah instalasi selesai, jalankan perintah untuk menginstall scaffolding Breeze: php artisan breeze:install Perintah ini akan menambahkan file-file yang diperlukan untuk fitur autentikasi seperti halaman login, register, dan dashboard pengguna. Jalankan Migrasi Setelah menginstall Breeze, jalankan migrasi untuk membuat tabel users dan password_resets: php artisan migrate Install Dependensi Frontend Laravel Breeze menggunakan Tailwind CSS untuk styling frontend. Jalankan perintah berikut untuk menginstall dependensi frontend dan membangun aplikasi: npm install && npm run dev Mengatur Middleware untuk Mengamankan Halaman Admin Untuk memastikan hanya pengguna yang sudah login yang dapat mengakses halaman admin, gunakan middleware auth pada route admin di file routes/web.php: Route::middleware(['auth'])->group(function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); // Route lainnya yang perlu diamankan }); Dengan middleware auth, Laravel akan memverifikasi apakah pengguna sudah login sebelum mengizinkan akses ke halaman admin. Konfigurasi Redirect Setelah Login Untuk mengarahkan pengguna ke halaman admin setelah login, buka file App\\\\Providers\\\\RouteServiceProvider.php dan ubah properti HOME menjadi URL halaman admin: public const HOME = '/admin'; Menggunakan Laravel Fortify Laravel Fortify adalah backend authentication scaffolding yang lebih fleksibel. Ini memberikan kontrol penuh untuk mengatur logika autentikasi tanpa dependensi frontend. Instalasi Laravel Fortify Untuk menginstall Fortify, jalankan perintah berikut di terminal: composer require laravel/fortify Publikasikan file konfigurasi Fortify dengan perintah berikut: php artisan vendor:publish --provider="Laravel\\\\Fortify\\\\FortifyServiceProvider" Ini akan menghasilkan file konfigurasi di config/fortify.php. Aktifkan Fitur Autentikasi Di dalam file config/fortify.php, aktifkan fitur-fitur yang dibutuhkan seperti login dan register dengan menambahkan: 'features' => [ Features::registration(), Features::resetPasswords(), Features::emailVerification(), Features::updateProfileInformation(), Features::updatePasswords(), Features::twoFactorAuthentication(), ], Jalankan Migrasi Fortify menggunakan tabel users dan password_resets. Pastikan tabel-tabel ini sudah ada di database dengan menjalankan migrasi: php artisan migrate Mengatur View untuk Login dan Register Untuk menambahkan form login dan register, buat file login.blade.php dan register.blade.php di dalam folder resources/views/auth. Contoh form login sederhana: <form method="POST" action="{{ route('login') }}"> @csrf <div> <label for="email">Email</label> <input id="email" type="email" name="email" required autofocus> </div> <div> <label for="password">Password</label> <input id="password" type="password" name="password" required> </div> <button type="submit">Login</button> </form> Contoh form register sederhana: <form method="POST" action="{{ route('register') }}"> @csrf <div> <label for="name">Name</label> <input id="name" type="text" name="name" required autofocus> </div> <div> <label for="email">Email</label> <input id="email" type="email" name="email" required> </div> <div> <label for="password">Password</label> <input id="password" type="password" name="password" required> </div> <button type="submit">Register</button> </form> Menggunakan Middleware untuk Mengamankan Halaman Admin Tambahkan middleware auth pada route admin di file routes/web.php untuk memastikan hanya pengguna yang sudah login yang dapat mengakses halaman admin: Route::middleware(['auth'])->group(function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); }); Konfigurasi Guard untuk Admin Untuk membatasi akses admin dengan lebih spesifik, Anda bisa menambahkan guard baru di file config/auth.php: 'guards' => [ 'admin' => [ 'driver' => 'session', 'provider' => 'users', ], ], Lalu, pastikan middleware auth:admin digunakan pada route admin: Route::middleware(['auth:admin'])->group(function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); }); Mengatur Role dan Permission Menggunakan Spatie Laravel Permission Untuk mengelola akses pengguna dengan lebih terperinci di aplikasi Laravel, kita bisa menggunakan package Spatie Laravel Permission. Package ini memungkinkan kita untuk mengatur role dan permission agar hanya pengguna tertentu yang memiliki akses ke fitur atau halaman tertentu. Dalam panduan ini, akan dijelaskan cara mengatur role seperti admin, product_manager, sales_staff, dan customer, serta menetapkan izin (permission) untuk masing-masing role beserta contoh koding lengkap. Instalasi Spatie Laravel Permission Mulailah dengan menginstal package Spatie Laravel Permission melalui Composer: composer require spatie/laravel-permission Setelah terinstal, jalankan perintah untuk mempublikasikan konfigurasi dan migrasi: php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider" Perintah ini akan membuat file konfigurasi config/permission.php dan migrasi untuk tabel roles, permissions, dan model_has_roles. Jalankan migrasi untuk membuat tabel-tabel tersebut: php artisan migrate Menambahkan Trait HasRoles ke Model User Untuk menggunakan fitur role dan permission pada model User, tambahkan trait HasRoles dari package Spatie di model User: namespace App\\\\Models; use Illuminate\\\\Foundation\\\\Auth\\\\User as Authenticatable; use Spatie\\\\Permission\\\\Traits\\\\HasRoles; class User extends Authenticatable { use HasRoles; // properti dan metode lainnya } Trait HasRoles ini memungkinkan model User untuk menggunakan metode seperti assignRole, hasRole, givePermissionTo, dan lainnya. Membuat Role dan Permission Gunakan seeder untuk membuat role dan permission pertama kali. Buat file seeder dengan perintah: php artisan make:seeder RolePermissionSeeder Isi file seeder RolePermissionSeeder.php seperti berikut: namespace Database\\\\Seeders; use Illuminate\\\\Database\\\\Seeder; use Spatie\\\\Permission\\\\Models\\\\Permission; use Spatie\\\\Permission\\\\Models\\\\Role; class RolePermissionSeeder extends Seeder { public function run() { // Membuat permission Permission::create(['name' => 'manage products']); Permission::create(['name' => 'manage categories']); Permission::create(['name' => 'manage orders']); Permission::create(['name' => 'view orders']); Permission::create(['name' => 'manage users']); // Membuat role Admin dan memberikan semua permission $admin = Role::create(['name' => 'admin']); $admin->givePermissionTo(Permission::all()); // Membuat role Product Manager dan memberikan permission terkait produk dan kategori $productManager = Role::create(['name' => 'product_manager']); $productManager->givePermissionTo(['manage products', 'manage categories']); // Membuat role Sales Staff dan memberikan permission terkait pesanan $salesStaff = Role::create(['name' => 'sales_staff']); $salesStaff->givePermissionTo(['view orders', 'manage orders']); // Membuat role Customer tanpa permission Role::create(['name' => 'customer']); } } Jalankan seeder untuk memasukkan data role dan permission ke database: php artisan db:seed --class=RolePermissionSeeder Seeder ini akan membuat role dan permission yang dibutuhkan serta menghubungkannya. Mengatur Role pada User Setelah role dan permission dibuat, Anda dapat memberikan role kepada pengguna. Misalnya, untuk membuat pengguna dengan role admin, gunakan contoh kode berikut di seeder atau di controller: use App\\\\Models\\\\User; use Spatie\\\\Permission\\\\Models\\\\Role; // Misalkan ini adalah user yang sudah terdaftar $adminUser = User::find(1); $adminUser->assignRole('admin'); $productManagerUser = User::find(2); $productManagerUser->assignRole('product_manager'); $salesStaffUser = User::find(3); $salesStaffUser->assignRole('sales_staff'); Dengan menggunakan metode assignRole, pengguna akan diberikan role yang sesuai. Middleware untuk Mengamankan Route Berdasarkan Role Untuk mengamankan route dengan role dan permission, gunakan middleware role atau permission yang disediakan oleh package Spatie. Contoh untuk mengamankan route agar hanya admin yang bisa mengakses: Route::group(['middleware' => ['role:admin']], function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); // Tambahkan route lain yang hanya bisa diakses oleh admin }); Untuk memberikan akses hanya kepada product_manager atau sales_staff, gunakan: Route::group(['middleware' => ['role:product_manager|sales_staff']], function () { Route::get('/orders', [OrderController::class, 'index'])->name('orders.index'); }); Dengan middleware ini, hanya pengguna dengan role product_manager atau sales_staff yang dapat mengakses halaman daftar pesanan. Middleware Permission untuk Mengakses Halaman Tertentu Jika ingin membatasi akses berdasarkan izin (permission), gunakan middleware permission: Route::group(['middleware' => ['permission:manage products']], function () { Route::get('/products', [ProductController::class, 'index'])->name('products.index'); Route::get('/products/create', [ProductController::class, 'create'])->name('products.create'); // Route lain yang membutuhkan izin 'manage products' }); Pengguna dengan izin manage products dapat mengakses halaman ini, tanpa memandang role-nya. Menampilkan Role dan Permission di Halaman Admin Untuk memberikan kontrol penuh kepada admin dalam mengelola role dan permission, Anda bisa membuat CRUD untuk role dan permission menggunakan resource Filament. Berikut adalah contoh untuk menampilkan role di halaman admin: namespace App\\\\Filament\\\\Resources; use Spatie\\\\Permission\\\\Models\\\\Role; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; 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() ->maxLength(255), Forms\\\\Components\\\\Select::make('permissions') ->multiple() ->relationship('permissions', 'name') ->preload(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('name')->sortable(), Tables\\\\Columns\\\\TextColumn::make('permissions.name')->label('Permissions')->wrap(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListRoles::route('/'), 'create' => Pages\\\\CreateRole::route('/create'), 'edit' => Pages\\\\EditRole::route('/{record}/edit'), ]; } } Dengan resource ini, admin dapat melihat, menambah, dan mengedit role serta mengatur permission untuk masing-masing role melalui dashboard. Integrasi Payment Gateway dengan Midtrans untuk Memproses Pembayaran Integrasi dengan payment gateway seperti Midtrans memungkinkan aplikasi Laravel Anda untuk memproses pembayaran secara langsung dari halaman checkout atau mengelola transaksi melalui halaman admin. Berikut adalah panduan lengkap untuk melakukan integrasi Midtrans, mulai dari instalasi hingga pengelolaan pembayaran melalui halaman admin. Instalasi SDK Midtrans Untuk memulai integrasi dengan Midtrans, pertama-tama pastikan package midtrans/midtrans-php sudah terpasang di proyek Laravel Anda. Anda bisa menginstalnya melalui Composer: composer require midtrans/midtrans-php Package ini akan membantu dalam berkomunikasi dengan API Midtrans untuk memproses pembayaran. Konfigurasi Midtrans Buat file konfigurasi midtrans.php di direktori config untuk menyimpan kredensial dan pengaturan API Midtrans: return [ 'merchant_id' => env('MIDTRANS_MERCHANT_ID'), 'client_key' => env('MIDTRANS_CLIENT_KEY'), 'server_key' => env('MIDTRANS_SERVER_KEY'), 'is_production' => env('MIDTRANS_PRODUCTION', false), 'is_sanitized' => env('MIDTRANS_SANITIZED', true), 'is_3ds' => env('MIDTRANS_3DS', true), ]; Tambahkan variabel konfigurasi berikut ke file .env Anda: MIDTRANS_MERCHANT_ID=your_merchant_id MIDTRANS_CLIENT_KEY=your_client_key MIDTRANS_SERVER_KEY=your_server_key MIDTRANS_PRODUCTION=false MIDTRANS_SANITIZED=true MIDTRANS_3DS=true Pengaturan ini memastikan bahwa aplikasi Anda dapat berkomunikasi dengan API Midtrans menggunakan kredensial yang benar. Membuat Fungsi untuk Memproses Pembayaran Buat sebuah controller baru untuk memproses pembayaran, misalnya PaymentController. Controller ini akan menangani permintaan pembayaran dari halaman checkout dan mengirimkan data ke Midtrans. namespace App\\\\Http\\\\Controllers; use Illuminate\\\\Http\\\\Request; use Midtrans\\\\Config; use Midtrans\\\\Snap; use App\\\\Models\\\\Order; class PaymentController extends Controller { public function processPayment(Request $request) { // Konfigurasi Midtrans Config::$serverKey = config('midtrans.server_key'); Config::$isProduction = config('midtrans.is_production'); Config::$isSanitized = config('midtrans.is_sanitized'); Config::$is3ds = config('midtrans.is_3ds'); // Mendapatkan data order dari database $order = Order::find($request->order_id); // Parameter yang dikirim ke Midtrans $params = [ 'transaction_details' => [ 'order_id' => $order->id, 'gross_amount' => $order->total_price, ], 'customer_details' => [ 'first_name' => $order->customer->name, 'email' => $order->customer->email, 'phone' => $order->customer->phone, ], 'item_details' => [ [ 'id' => 'product-' . $order->product_id, 'price' => $order->product->price, 'quantity' => $order->quantity, 'name' => $order->product->name, ], ], ]; try { // Mendapatkan Snap Token dari Midtrans $snapToken = Snap::getSnapToken($params); // Menampilkan halaman checkout dengan Snap Token return view('payment.checkout', ['snapToken' => $snapToken, 'order' => $order]); } catch (\\\\Exception $e) { return back()->with('error', 'Gagal memproses pembayaran: ' . $e->getMessage()); } } public function handleNotification(Request $request) { // Logika untuk menangani notifikasi dari Midtrans } } Pada fungsi processPayment, data order dikirim ke Midtrans untuk mendapatkan Snap Token yang akan digunakan untuk menampilkan halaman pembayaran. Simpan Snap Token ini dan gunakan pada halaman checkout. Membuat Halaman Checkout Buat file view resources/views/payment/checkout.blade.php untuk menampilkan halaman checkout dengan widget Snap Midtrans: @extends('layouts.app') @section('content') <h1>Checkout</h1> <p>Order ID: {{ $order->id }}</p> <p>Total Pembayaran: Rp {{ number_format($order->total_price, 0, ',', '.') }}</p> <button id="pay-button">Bayar Sekarang</button> <script type="text/javascript" src="<https://app.sandbox.midtrans.com/snap/snap.js>" data-client-key="{{ config('midtrans.client_key') }}"></script> <script type="text/javascript"> var payButton = document.getElementById('pay-button'); payButton.addEventListener('click', function () { window.snap.pay('{{ $snapToken }}', { onSuccess: function (result) { alert("Pembayaran berhasil!"); console.log(result); }, onPending: function (result) { alert("Menunggu pembayaran!"); console.log(result); }, onError: function (result) { alert("Pembayaran gagal!"); console.log(result); }, onClose: function () { alert('Anda menutup pop-up tanpa menyelesaikan pembayaran'); } }); }); </script> @endsection Widget Snap dari Midtrans akan membuka pop-up untuk memproses pembayaran ketika tombol "Bayar Sekarang" ditekan. Pop-up ini memungkinkan pengguna untuk menyelesaikan transaksi dengan berbagai metode pembayaran yang disediakan oleh Midtrans. Mengelola Pembayaran Melalui Halaman Admin Untuk mengelola pembayaran dari halaman admin, Anda dapat membuat resource baru menggunakan Filament untuk menampilkan data order dan status pembayaran. Misalnya, buat resource OrderResource untuk mengelola pesanan dan statusnya: namespace App\\\\Filament\\\\Resources; use App\\\\Models\\\\Order; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Table; use Filament\\\\Forms; use Filament\\\\Tables; class OrderResource extends Resource { protected static ?string $model = Order::class; protected static ?string $navigationIcon = 'heroicon-o-clipboard-list'; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('id')->disabled(), Forms\\\\Components\\\\TextInput::make('customer_name')->disabled(), Forms\\\\Components\\\\TextInput::make('status'), Forms\\\\Components\\\\TextInput::make('total_price')->disabled(), Forms\\\\Components\\\\Textarea::make('note'), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('customer.name')->label('Customer'), Tables\\\\Columns\\\\TextColumn::make('status')->sortable(), Tables\\\\Columns\\\\TextColumn::make('total_price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // Tambahkan filter status pembayaran jika diperlukan ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListOrders::route('/'), 'edit' => Pages\\\\EditOrder::route('/{record}/edit'), ]; } } Dengan resource ini, Anda dapat melihat daftar pesanan, mengubah status pembayaran, dan memberikan catatan pada setiap pesanan melalui halaman admin. Menangani Notifikasi dari Midtrans Midtrans menyediakan fitur notifikasi untuk memberi tahu server Anda ketika status transaksi berubah (misalnya, pembayaran berhasil atau gagal). Tambahkan route di file routes/web.php untuk menangani notifikasi ini: Route::post('/payment/notification', [PaymentController::class, 'handleNotification']); Di dalam fungsi handleNotification pada PaymentController, Anda bisa menangani notifikasi ini dan memperbarui status pembayaran di database: public function handleNotification(Request $request) { $notification = $request->all(); // Logika untuk memperbarui status pesanan berdasarkan notifikasi $order = Order::find($notification['order_id']); if ($notification['transaction_status'] == 'settlement') { $order->status = 'paid'; } elseif ($notification['transaction_status'] == 'cancel' || $notification['transaction_status'] == 'deny' || $notification['transaction_status'] == 'expire') { $order->status = 'failed'; } $order->save(); return response()->json(['status' => 'success']); } Fungsi ini akan menerima notifikasi dari Midtrans dan memperbarui status pesanan di database sesuai dengan status pembayaran yang diterima. Menambahkan Fitur Notifikasi Email Otomatis di Laravel Fitur notifikasi email otomatis sangat penting untuk menginformasikan pengguna ketika ada pesanan baru, perubahan status pesanan, atau pengingat untuk menyelesaikan pembayaran. Laravel menyediakan fitur Mailable yang memungkinkan kita untuk mengirim email secara dinamis berdasarkan event tertentu. Berikut adalah panduan lengkap untuk membuat email template menggunakan Mailable dan mengatur pengiriman email berdasarkan event seperti perubahan status pesanan. Mengatur Konfigurasi Mail di Laravel Pastikan konfigurasi mail di Laravel sudah diatur dengan benar di file .env: MAIL_MAILER=smtp MAIL_HOST=smtp.example.com MAIL_PORT=587 [email protected] MAIL_PASSWORD=your_password MAIL_ENCRYPTION=tls [email protected] MAIL_FROM_NAME="${APP_NAME}" Jika Anda menggunakan layanan email seperti Gmail, pastikan MAIL_HOST disesuaikan menjadi smtp.gmail.com, dan MAIL_PORT diatur ke 587 atau 465 dengan MAIL_ENCRYPTION yang sesuai (tls atau ssl). Membuat Email Template dengan Mailable Laravel menyediakan fitur Mailable untuk membuat template email. Gunakan perintah berikut untuk membuat Mailable: php artisan make:mail OrderStatusChanged Ini akan membuat file OrderStatusChanged.php di direktori app/Mail. Buka file tersebut dan atur sesuai kebutuhan: namespace App\\\\Mail; use App\\\\Models\\\\Order; use Illuminate\\\\Bus\\\\Queueable; use Illuminate\\\\Mail\\\\Mailable; use Illuminate\\\\Queue\\\\SerializesModels; class OrderStatusChanged extends Mailable { use Queueable, SerializesModels; public $order; public function __construct(Order $order) { $this->order = $order; } public function build() { return $this->subject('Status Pesanan Anda Telah Berubah') ->view('emails.order-status') ->with([ 'order_id' => $this->order->id, 'status' => $this->order->status, 'customer_name' => $this->order->customer->name, ]); } } Di sini, kita mengirimkan objek Order ke dalam email template dan menggunakan metode build() untuk menentukan subject email dan view yang akan digunakan. Membuat View untuk Template Email Buat file view order-status.blade.php di direktori resources/views/emails: <!DOCTYPE html> <html> <head> <title>Status Pesanan Berubah</title> </head> <body> <h1>Halo, {{ $customer_name }}</h1> <p>Pesanan Anda dengan ID <strong>{{ $order_id }}</strong> sekarang berstatus: <strong>{{ $status }}</strong>.</p> <p>Terima kasih telah berbelanja di toko kami. Jika ada pertanyaan, jangan ragu untuk menghubungi kami.</p> <p>Salam,<br>{{ config('app.name') }}</p> </body> </html> Template ini akan digunakan untuk menampilkan email yang berisi informasi mengenai perubahan status pesanan. Mengirim Email Berdasarkan Event Untuk mengirim email berdasarkan event tertentu, misalnya ketika status pesanan berubah, kita bisa menggunakan Event dan Listener di Laravel. Buat event baru dengan perintah: php artisan make:event OrderStatusUpdated Buka file event OrderStatusUpdated.php yang baru dibuat dan tambahkan properti order: namespace App\\\\Events; use App\\\\Models\\\\Order; use Illuminate\\\\Foundation\\\\Events\\\\Dispatchable; use Illuminate\\\\Queue\\\\SerializesModels; class OrderStatusUpdated { use Dispatchable, SerializesModels; public $order; public function __construct(Order $order) { $this->order = $order; } } Buat listener untuk menangani event ini dengan perintah: php artisan make:listener SendOrderStatusChangedEmail Di dalam listener SendOrderStatusChangedEmail.php, kirim email menggunakan Mailable yang telah dibuat sebelumnya: namespace App\\\\Listeners; use App\\\\Events\\\\OrderStatusUpdated; use App\\\\Mail\\\\OrderStatusChanged; use Illuminate\\\\Contracts\\\\Queue\\\\ShouldQueue; use Illuminate\\\\Support\\\\Facades\\\\Mail; class SendOrderStatusChangedEmail implements ShouldQueue { public function handle(OrderStatusUpdated $event) { $order = $event->order; // Mengirim email menggunakan Mailable Mail::to($order->customer->email)->send(new OrderStatusChanged($order)); } } Di listener ini, kita menggunakan facade Mail untuk mengirim email ke customer berdasarkan event OrderStatusUpdated. Menghubungkan Event dan Listener Pastikan event dan listener yang telah dibuat dihubungkan dalam file EventServiceProvider.php di app/Providers: namespace App\\\\Providers; use App\\\\Events\\\\OrderStatusUpdated; use App\\\\Listeners\\\\SendOrderStatusChangedEmail; use Illuminate\\\\Foundation\\\\Support\\\\Providers\\\\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { protected $listen = [ OrderStatusUpdated::class => [ SendOrderStatusChangedEmail::class, ], ]; public function boot() { parent::boot(); } } Dengan konfigurasi ini, setiap kali event OrderStatusUpdated dipanggil, listener SendOrderStatusChangedEmail akan menangani pengiriman email. Memicu Event saat Status Pesanan Berubah Di dalam model Order atau di controller tempat Anda mengubah status pesanan, panggil event OrderStatusUpdated setiap kali status pesanan diperbarui: use App\\\\Events\\\\OrderStatusUpdated; $order->status = 'shipped'; $order->save(); // Memicu event setelah status pesanan diperbarui event(new OrderStatusUpdated($order)); Dengan memicu event ini, Laravel akan secara otomatis menjalankan listener yang terhubung dan mengirimkan email notifikasi kepada pengguna. Mengirim Pengingat untuk Menyelesaikan Pembayaran Untuk mengirim pengingat kepada pengguna yang belum menyelesaikan pembayaran, buatlah Mailable dan event serupa. Anda dapat menggunakan scheduler untuk memeriksa pesanan yang belum dibayar dan mengirimkan pengingat. Buat seeder atau command artisan untuk memeriksa pesanan yang belum dibayar: php artisan make:command SendPaymentReminder Di dalam command SendPaymentReminder.php, lakukan logika untuk memeriksa pesanan yang belum dibayar: namespace App\\\\Console\\\\Commands; use Illuminate\\\\Console\\\\Command; use App\\\\Models\\\\Order; use Illuminate\\\\Support\\\\Facades\\\\Mail; use App\\\\Mail\\\\PaymentReminder; class SendPaymentReminder extends Command { protected $signature = 'reminder:payment'; protected $description = 'Kirim pengingat pembayaran kepada pelanggan yang belum menyelesaikan pembayaran'; public function handle() { $orders = Order::where('status', 'pending')->get(); foreach ($orders as $order) { Mail::to($order->customer->email)->send(new PaymentReminder($order)); } $this->info('Pengingat pembayaran berhasil dikirim!'); } } Gunakan scheduler di file App\\\\Console\\\\Kernel.php untuk menjalankan perintah ini setiap hari atau sesuai kebutuhan: protected function schedule(Schedule $schedule) { $schedule->command('reminder:payment')->daily(); } Ini akan memastikan bahwa pengingat pembayaran dikirimkan secara otomatis kepada pelanggan yang belum menyelesaikan pembayaran setiap hari. Penutup dan saran dari mentor Laravel terus menjadi framework yang populer di kalangan developer berkat berbagai update menarik yang memudahkan pengembangan aplikasi web. Dengan fitur-fitur seperti autentikasi yang sederhana, integrasi payment gateway, hingga notifikasi otomatis, Laravel memudahkan developer untuk membangun aplikasi yang robust dan scalable. Kemudahan ini membuat Laravel tetap menjadi pilihan utama untuk banyak proyek pengembangan web. Untuk terus memperdalam pengetahuan Anda tentang Laravel dan teknologi lainnya, pantau terus website BuildWithAngga. Mereka sering memperbarui kelas gratis dengan studi kasus menarik yang dipandu oleh mentor berpengalaman. Selain itu, Anda juga bisa mendapatkan akses kelas seumur hidup, sehingga dapat belajar kapan saja sesuai kebutuhan. Jangan lewatkan kesempatan untuk mengembangkan skill Anda bersama BuildWithAngga dan jadilah developer yang handal!